DockerでPython・Flask環境を構築する方法(ハンズオン講座)

Docker_Python_Flask

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、DockerでPython・Flask環境を構築する方法について解説していきます。

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 stopdocker-compose rmコマンドを使用する必要があります。

Dockerの学習・参考書

参考・引用

  1. Docker + Flask 環境構築
  2. Docker Composeでflask開発環境構築
  3. Flaskの開発環境をDockerで構築する

最近の投稿