DockerコンテナでFlaskアプリをパッケージ化する

nogajun
nogajun

Flaskで作ったアプリをデプロイする方法を考えていたけど、dockerでコンテナにしてパッケージ化するのが手っ取り早そうなので、コンテナを作るメモ。

この記事が役に立ったらコーヒーをおごろう

下のリンクはBuy me a coffeeという投げ銭システムのリンクです。役に立ったと思ったら、ぜひ投げ銭をお願いします。

Flaskアプリを用意する

Flaskアプリがないと始まらないのでテスト用のFlaskアプリを用意する。テスト用のアプリは、venvで環境を作り、その中にFlaskをインストールして用意する。

$ python -m venv docker_flask # docker_flaskフォルダにvenv環境を用意
$ cd docker_flask/ # フォルダに入る 
$ source bin/activate # venv環境を有効化する
$ pip install flask # Flaskをインストール

venv環境にflaskをインストールしたら、動作確認用の簡単なアプリを用意する。アプリは、appフォルダにまとめておく。

$ mkdir app
$ touch app/app.py # 空のFlaskファイル
$ mkdir app/templates
$ touch app/templates/index.html # 空のテンプレート

エディタでapp.pyとtemplates/index.htmlを以下のように編集して用意する。

app.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    text ="これはFlaskアプリのテストです"
    return render_template('index.html', text = text)

if __name__== '__main__':
    app.run(host='0.0.0.0')

templates/index.html

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Flask App</title>
</head>

<body>
  <h1>{{ text }}</h1>
</body>

</html>

用意したら実行して動作を確認する。ブラウザが開いてメッセージが出ればOK。

$ python app.py

Waitressをインストールする

本番で使うにはWSGIサーバーが必要なので、Waitressをインストールする。

Waitressを選んだ理由は特になく、単にFlaskチュートリアルに出てたから選んだだけなので使いたいものがあるなら、それを使ってください。

$ pip install waitress

Waitressをインストールしたら、Flaskアプリ(ここではapp.py)をWaitressを使って動かすために変更する。

from waitress import serve # 追加する

(中略)

if __name__ == "__main__":
    serve(app, host='0.0.0.0', port=5000) # app.runから変更する

Waitress用に変更したら、再度実行してWaitressサーバーで動くか確認する。

$ python app.py

requirements.txtファイルを作る

Flaskなどをインストールするためのパッケージ一覧をrequirements.txtに書き出す。

$ pip freeze > requirements.txt

パッケージ一覧を書き出しておくと以下のコマンドでパッケージを一括インストールできる。

$ pip install -r requirements.txt

Dockerfileを作ってコンテナにまとめる

ひととおり準備できたのでDockerfileを作ってコンテナとしてまとめる。

Dockerfile

FROM python:3.10-alpine
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY ./app/ /app/
CMD ["python","app.py" ]

Dockerfileを作ったらコンテナをビルドする。

$ docker image build -t flaskapp .

ビルドしたらコンテナを実行して確認する。

$ docker run -p 5000:5000 flaskapp

ブラウザでlocalhost:5000にアクセスして、最初に試したようにメッセージが出ればコンテナ化できている。

この記事が役に立ったらコーヒーをおごろう

下のリンクはBuy me a coffeeという投げ銭システムのリンクです。役に立ったと思ったら、ぜひ投げ銭をお願いします。