Python

【簡単】DockerでFlaskの実行環境(コンテナ)を作成する方法

こんにちは、はやたす(@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にアクセスしてみてください。

docker-flask1

こんな感じで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-flask2

これでDockerを使ったFlaskの実行環境を作成できるようになりました。もしコンテナの動作を止めたいということであれば、以下のコマンドを実行してください。

$ docker container stop myflask

 

コンテナ作成時に--rmを付けているので、コンテナ動作の停止後に削除されるようになっています。以下のコマンドを入力すればmyflaskコンテナが削除されていることが分かるはずです。

$ docker container ls -a

 

もしイメージも不要なら、以下のコマンドで削除しましょう。

$ docker image rm python-flask

 

これで後片付けも完了です。

 

ABOUT ME
はやたす
たくさんPythonを紹介するYouTuberです(登録者1.94万人) | フリーランスで機械学習/分析案件も請けています(経験業界 : 金融, 情報通信, サービス) | 元プログラミングスクール講師