こんにちはフロントエンドエンジニアのまさにょんです!
今回は、DockerでPython・Flask環境を構築する方法について解説していきます。
目次
- 1 DockerでPython・Flask環境を構築する方法(ハンズオン講座)
- 1.1 プロジェクト・ディレクトリの作成と移動
- 1.2 FlaskAppのSrcを格納するappディレクトリを作成する
- 1.3 Flaskアプリケーションを作成する
- 1.4 requirements.txt を作成する
- 1.5 Dockerfileを作成する
- 1.6 docker-compose.yml を作成する
- 1.7 treeコマンドで、現時点のDirectory構造を確認する
- 1.8 docker-compose で Dockerfile から image をビルドする
- 1.9 docker-compose で Docker コンテナを実行する
- 1.10 Docker Container の起動状況を確認する・FlaskAppにアクセスする
- 1.11 Docker Composeの終了
- 2 Dockerの学習・参考書
- 3 参考・引用
- 4 最近の投稿
DockerでPython・Flask環境を構築する方法(ハンズオン講座)
プロジェクト・ディレクトリの作成と移動
まずは、次のコマンドでプロジェクト・ディレクトリの作成と移動をします。
プロジェクト・ディレクトリ名は、自由に決めてください。
mkdir flask-api && cd flask-api
FlaskAppのSrcを格納するappディレクトリを作成する
続いて、FlaskAppのSrcを格納するappディレクトリを作成と移動します。
mkdir app && cd app
Flaskアプリケーションを作成する
最低限のFlaskアプリケーションを作成します。
次のコマンドでapp.py
ファイルを作成して、開きます。
touch app.py && open app.py
app.py
ファイルには、次のSampleCodeをコピペしてください。
Hello Worldを表示する簡単なアプリケーションです。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
requirements.txt を作成する
Dockerfile
で使用するPythonパッケージをrequirements.txt
に記述します。
touch requirements.txt && open requirements.txt
今回は、Python-Flaskの環境構築なので、Flaskを記載します。
初期の段階で、他に必要なパッケージがあったら、ここに記載しておきます。
flask==2.0.1
Dockerfileを作成する
それでは、やっとDockerfileを作成していきますが、app
ディレクトリから1つ上の階層に戻ります。
Dockerfileなどの設定ファイルは、プロジェクト・ルートにて作成していきます。
cd ../
Dockerfile
は、Dockerイメージをビルドするための設定ファイルです。
次のコマンドで、Dockerfile
を作成して開きます。
touch Dockerfile && open Dockerfile
openしたDockerfile
の内容は、次の内容をコピペしてください。
FROM python:3.8-slim-buster
# Docker Image内で実行される作業ディレクトリ(Path)を指定する: ない場合は作ってくれます。
WORKDIR /usr/src/app
# Flask環境変数: Dockerコンテナ内で、Flaskがアプリケーションを正しく検出し、起動できるようになります。
ENV FLASK_APP=app
# Hostマシンのディレクトリ・ファイル を Container側のPathに COPY(追加)する
COPY ./app ./
# RUNコマンド: Docker Image内で、コマンドを実行する
# pipを最新バージョンに更新する
RUN pip install --upgrade pip
# パッケージをキャッシュせずにインストール & -rオプションで、依存パッケージを一括インストール
RUN pip install --no-cache-dir -r requirements.txt
FLASK_APP
環境変数は、Flaskアプリケーションのエントリーポイントを指定するために使用されます。
この環境変数にアプリケーションのエントリーポイントを指定することで、
Dockerコンテナ内でFlaskアプリケーションを起動する際に、Flaskがアプリケーションを正しく検出し、起動できるようになります。
docker-compose.yml を作成する
最後にdocker-compose.yml
を作成していきます。
次のコマンドを実行してdocker-compose.yml
を作成して開きます。
touch docker-compose.yml && open docker-compose.yml
openしたdocker-compose.yml
の内容は、次の内容をコピペしてください。
version: "3"
services:
# Service名は、flask
backend-app:
# DockerfileまでのPath
build: .
# ports => HostPort: CotainerPort の形で、Portを公開している。
ports:
- "5001:5000"
# コンテナに名前をつける
container_name: flask_api
# Hostマシンの ./app を Container の /usr/src/app にマウントしています。
volumes:
- ./app:/usr/src/app
# Flaskを実行する
command: flask run --host=0.0.0.0
treeコマンドで、現時点のDirectory構造を確認する
treeコマンドで、現時点のDirectory構造を確認すると次のようになっているはずです。
flask-api % tree
.
├── Dockerfile
├── app
│ ├── app.py
│ └── requirements.txt
└── docker-compose.yml
2 directories, 4 files
docker-compose で Dockerfile から image をビルドする
続いて、Dockerfile から Docker Image を作成します。docker-compose build
コマンドは、Dockerfile から image を作成してくれるコマンドです。
docker-compose build
このコマンドを実行すると、Dockerfile に従って各サービスの Docker イメージがビルドされ、
イメージ名とタグ名が作成されます。
docker image ls
で、build された image を確認しておきます。
flask-api-backend-app
という名前のDocker Imageができていることを確認できるはずです。
docker image ls
# [ 出力結果 ]
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-api-backend-app latest 5f1597c166e0 50 seconds ago 135MB
docker-compose で Docker コンテナを実行する
次のコマンドで、定義したサービスをバックグラウンドで起動します。
docker-compose up -d
docker-compose up
コマンドは、docker-compose.yml
ファイルからサービスをビルドし、Containerを起動するためのコマンドです。
-d
フラグは、コンテナをデタッチドモードで実行することを指定しています。
Docker Container の起動状況を確認する・FlaskAppにアクセスする
Docker Container の起動状況は、docker container ps
コマンドで確認できます。
flask_api
という名前のDocker Container が、Hostマシンの0.0.0.0:5001
で公開されていることを確認できるはずです。
flask-api % docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baf30ca28ee1 flask-api-backend-app "flask run --host=0.…" 15 seconds ago Up 14 seconds 0.0.0.0:5001->5000/tcp flask_api
最後に、Webブラウザから http://localhost:5001/ にアクセスして「 Hello, World! 」の表示を確認すれば環境構築の最終確認は完了です。
Docker Composeの終了
Docker Composeで立ち上げたDocker Containerたちは、次のコマンドで、一括停止 & 一括削除できます。
コマンドの実行は、プロジェクト・ルードで行います。
docker-compose down
ちなみに、docker-compose down
コマンドに引数は必要ありません。
引数を指定しなくても、このコマンドは、プロジェクト内のdocker-compose.yml
ファイルを自動的に探し、実行されます。
つまり、そのDirectory内のdocker-compose.yml
を自動で発見して、定義されている、すべてのサービスのコンテナを停止 & 削除してくれるわけです。
引数に指定したサービスのみを停止・削除するには、docker-compose stop
やdocker-compose rm
コマンドを使用する必要があります。