こんにちは、はやたす(@hayatasuuu )です。
今回は「DockerでFlaskの実行環境を作成する方法」を紹介します。
多分”Flask Docker”とか”Docker Flask”で検索してるあなたは「とりあえず一番カンタンな方法を教えて欲しいな…」と考えているはずです。
というのも、記事によって紹介されているDockerコンテナの作成方法が違うんですよね。
だからDockerに慣れていないと、どの方法を採用したら良いのか迷ってきます。
この記事は、Dockerの扱いに慣れていないあなたを手助けします。
具体的には、Dockerfileだけで「とりあえずFlaskの環境を作る方法」を紹介していきます。
必要なのは、たったの3ステップ。
順を追うだけで…、というかコピペするだけで完了します。
まずは実装を体験してみて、後から理解を深めていきましょう。
【簡単】DockerでFlaskの実行環境(コンテナ)を作成する方法
結論、DockerでFlaskの実行環境を作成するには、以下の3ステップが必要です。
- STEP1 : Pythonファイルを作成する
- STEP2 : Dockerfileでイメージを作成する
- STEP3 : イメージからコンテナをビルドする
それでは順番に見ていきましょう。
STEP1 : Pythonファイルを作成する
Pythonファイルを作成するにあたって、まずは今回のプロジェクトフォルダを作成しましょう。この記事では/Users/<ユーザー名>/Dev/docker-flask
というフォルダを作成しています。とりあえず記事の内容を試したいということなら、デスクトップ配下で良いと思います。
また、最終的なフォルダ構成は以下のようになります。
$ tree .
# .
# ├── Dockerfile
# └── app
# └── app.py
#
# 1 directory, 2 files
Dockerfileはあとで書くので、今はapp
配下にFlask用のPythonファイルを作成しましょう。
今回は”Hello World”を出力するプログラムをapp.py
に書いておきます。
import os
from flask import Flask
port = int(os.environ['PORT'])
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World!!!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=port)
これでSTEP①は完了です。
STEP2 : Dockerfileでイメージを作成する
Pythonファイルを作成したら、次にDockerfileを準備しましょう。これを元にDockerイメージを作成します。
結論、今回Dockerfileに書く内容は以下のとおりです。
FROM python:3.8.11-slim-buster
RUN pip install --upgrade pip
RUN pip install flask==2.0.1
ENV PORT 80
WORKDIR /app
COPY ./app/ /app
CMD ["python", "app.py"]
1行目ではベースになるコンテナイメージを指定しています。
なんとなく分かるかもしれませんが、今回指定しているのはバージョン3.8.11のPythonを使うためのコンテナイメージです。
その後に付いてるslim-busterはOSの選択部分です。他にも以下のようなOSを選べます。
- buster / slim-buster
- alpine
- streach / slim-streach
今回使っているBusterとかStreachというのは、Debianのコードネームです。コードネームはDebianのバージョンを表しています。
- Streach : Debian 9
- Buster : Debian 10
つまり今回使っているslim-busterは、OSにDebian10が使われているということです。
それにslimが付いているので、色々なインストール済みパッケージを含まないBusterの軽量版になります。
他にも色々なPythonイメージがあるので詳しくはDocker Hubを見てみてください。
※なお、PythonのDockerイメージで、OSにAlpine Linuxを選ぶべきではありません。詳細は以下の記事に譲りますが、ビルド時間が長くなるなどパフォーマンス上の問題があるからです。(参考 : The best Docker base image for your Python application (February 2021))
さて、話を戻して。Dockerfileを作成できたら、それを元にDockerイメージを作成します。
そのためには、以下のコマンドをターミナルで入力します。
$ docker image build -t python-flask .
このコマンドを使えばpython-flask
という名前で、Dockerfileを元にDockerイメージを作成します。
おそらく最初はイメージの作成に時間がかかります。少し待ちましょう。
もしもイメージの作成が完了したら、以下のコマンドを入力してみてください。
$ docker image ls
# REPOSITORY TAG IMAGE ID CREATED SIZE
# python-flask latest 62823313b6f7 About an hour ago 118MB
これで作成したイメージを確認できるはずです。
STEP3 : イメージからコンテナをビルドする
最後にイメージを元にコンテナをビルドしましょう。
結論、ここで入力するコマンドは以下です。
docker container run --rm -d -p 5000:80 -v ${PWD}/app:/app --name myflask python-flask
コマンドを実行するとランダムな英数字が出力されます。
これはDockerコンテナの作成が完了した合図です。
あとは自分のPCでFlaskを動かすときと同じようにlocalhost:5000
にアクセスしてみてください。
こんな感じでHello Worldと表示されたページを開けるはずです。
コードを変更したいときはapp/app.py
をそのまま編集します。試しにHello Worldに対してh1タグを付けてみましょう。
import os
from flask import Flask
port = int(os.environ['PORT'])
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!!!</h1>'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=port)
コードを保存したら、ページを更新してみてください。ちゃんとh1タグが付いているはずです。
これでDockerを使ったFlaskの実行環境を作成できるようになりました。
もしコンテナの動作を止めたいということであれば、以下のコマンドを実行してください。
$ docker container stop myflask
コンテナ作成時に--rm
を付けているので、コンテナ動作の停止後に削除されるようになっています。
以下のコマンドを入力すればmyflask
コンテナが削除されていることが分かるはずです。
$ docker container ls -a
もしイメージも不要なら、以下のコマンドで削除しましょう。
$ docker image rm python-flask
これで後片付けも完了です。