「ローカル環境を汚さずにFlaskを学びたい」という動機で、Docker Composeを使った最小構成のFlask環境を作ったのでまとめます。pip install flask をホストで実行せず、すべてコンテナの中で完結させるのがポイントです。
完成形
flask/
├── compose.yaml # ポート公開・ボリュームマウント・ホットリロード
├── Dockerfile # python:3.12-slim + pip install
├── requirements.txt # 依存ライブラリ
└── app.py # "Hello, World!" を返す最小アプリ
各ファイル
app.py
from flask import Flask
# Flaskアプリケーションの本体を生成する
app = Flask(__name__)
# ルートURL("/")にアクセスされたときの処理
@app.route("/")
def hello():
return "Hello, World!"
if __name__ == "__main__":
# 0.0.0.0 で待ち受けることでコンテナ外(ホスト)からアクセスできる
app.run(host="0.0.0.0", port=5000, debug=True)
ポイントは host="0.0.0.0"。デフォルトの 127.0.0.1 のままだとコンテナ内でしか待ち受けず、ホストのブラウザからアクセスできません。
requirements.txt
Flask>=3.0
Flask-SQLAlchemy>=3.1
Dockerfile
# 軽量なPython公式イメージをベースにする
FROM python:3.12-slim
# コンテナ内の作業ディレクトリ
WORKDIR /app
# 先にrequirements.txtだけコピーしてインストール(レイヤキャッシュを効かせる)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリ本体はcompose.yamlのボリュームマウントで渡すため、ここではコピーしない
# Flaskの開発サーバを起動
CMD ["python", "app.py"]
compose.yaml
services:
web:
build: .
ports:
# ホストの5000番をコンテナの5000番に転送 → http://localhost:5000
- "5000:5000"
volumes:
# カレントディレクトリをコンテナの/appにマウント → コード編集が即反映
- .:/app
environment:
# debug=True と合わせてホットリロードを有効化
- FLASK_DEBUG=1
起動と確認
docker compose up --build
別ターミナルで動作確認:
$ curl -i http://localhost:5000/
HTTP/1.1 200 OK
Server: Werkzeug/3.1.8 Python/3.12.13
Content-Type: text/html; charset=utf-8
Hello, World!
ブラウザで http://localhost:5000 を開くと "Hello, World!" が表示されます。
設計のキモ:ライブラリとソースコードで扱いを分ける
この構成の肝は、Flask(ライブラリ)はイメージに焼き込み、app.py(ソース)はマウントで渡すという役割分担です。
| 対象 | 渡し方 | 変更時の操作 |
|---|---|---|
| Flask等のライブラリ | ビルド時に pip install でイメージに焼き込む |
requirements.txt を編集して --build で再ビルド |
| app.py(ソースコード) | ボリュームマウントで渡す | 保存するだけで自動リロード(ビルド不要) |
なぜ requirements.txt を先にコピーするのか
Dockerのレイヤキャッシュを効かせるためです。app.py を編集してもライブラリのレイヤは変わらないので、pip install は再実行されません。requirements.txt を変更したときだけインストールが走ります。
Flaskはどのタイミングで入るのか
docker compose up --build
① FROM python:3.12-slim ← Python本体(ベースイメージに同梱)
② COPY requirements.txt ← 依存リストをコピー
③ RUN pip install ... ← ★ここでFlaskをインストール(ビルド時)★
④ docker compose up ← コンテナ起動(python app.py)
ホスト側には一切Pythonライブラリを入れないため、環境が汚れません。
よく使うコマンド
| やりたいこと | コマンド |
|---|---|
| 起動 |
docker compose up(-d でバックグラウンド) |
| 停止 | docker compose down |
| ログ確認 | docker compose logs -f |
| 再ビルド | docker compose up --build |
まとめ
- ホストには Docker だけあればよく、Python/Flask はコンテナ内で完結
- マウント + debugモードでホットリロードが効くので開発体験も良い
- 次は
templates/を使ったrender_templateでHTML表示に進む予定