この記事では、FlaskアプリケーションをDockerを使ってデプロイする方法を解説します。
WSGIとNginxを組み合わせた構成で、プロダクション環境に適した形で動作させることを目標とします。
Nginx+WSGI+Flask構成の概要
以下の3つの役割をそれぞれ分けて構築します。
- Nginx
- クライアントからのリクエストを受け取るリバースプロキシ。
- 静的ファイルの配信やGunicornへのプロキシ機能を提供します。
- WSGI
- WSGI (Web Server Gateway Interface) とは、Python製のWebアプリケーションとWebサーバー間の通信を標準化するためのインターフェース規格です。
WSGIは、PythonアプリケーションがWebサーバーからのリクエストを受け取り、レスポンスを返す仕組みを定義しています。
WSGIには、GunicornやuWSGIなどがあります。 - Gunicornの特徴
「Python専用」のシンプルなWSGIサーバー。
主にFlaskやDjangoのようなPython Webフレームワーク向けに設計。
シンプルさと使いやすさを重視し、最低限の機能に特化しています。 - uWSGIの特徴
Pythonに限らず、複数の言語やプロトコルをサポートする汎用アプリケーションサーバー。
高度な機能(プロセスマネージャー、リバースプロキシ、ロードバランサーなど)をサポート。
柔軟性と拡張性を重視しています。
- WSGI (Web Server Gateway Interface) とは、Python製のWebアプリケーションとWebサーバー間の通信を標準化するためのインターフェース規格です。
- Flask
- アプリケーション本体を担当し、クライアントからのリクエストを処理します。
コンテナ構成
[ クライアント ]
|
| HTTPリクエスト
v
[ Nginx コンテナ ]
|
| プロキシリクエスト
v
[ WSGIサーバーとFlaskは同一コンテナ内で運用 ]
[[ WSGI サーバー ]]
|
| アプリケーションの呼び出し
v
[[ Flask アプリケーション ]]
Nginx+Gunicorn+Flask構成の場合
必要なファイルとディレクトリ構成
以下のディレクトリ構成を用意します。
project/
├── app.py # Flaskアプリケーション
├── docker-compose.yml # Docker Compose設定
├── Dockerfile # Flaskアプリ用のDockerfile
├── gunicorn_config.py # Gunicorn設定ファイル
├── requirements.txt # 必要なライブラリ一覧
└── nginx/
└── nginx.conf # Nginx設定ファイル
各ファイルの内容
Flaskアプリケーション (app.py)
Flaskで簡単なWebアプリケーションを作成します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Gunicorn設定ファイル (gunicorn_config.py)
Gunicorn (Green Unicorn) の設定を定義するためのPythonスクリプトです。
bind = '0.0.0.0:5000' # Gunicornがリッスンするアドレスとポート
workers = 3 # ワーカー数(並列処理数)
依存関係リスト (requirements.txt)
Pythonプロジェクトで使用する外部ライブラリや依存関係を一覧化したファイルです。
Flask
gunicorn
Dockerfile
Dockerfile は、Dockerコンテナ(イメージ)を作成するための設計図となるテキストファイルです。
ここでは、Flaskアプリケーション用のDockerfileを作成します。
# ベースイメージを指定
FROM python:3.8-slim
# 作業ディレクトリを設定
WORKDIR /app
# 必要なファイルをコピー
COPY requirements.txt /app
COPY app.py /app
COPY gunicorn_config.py /app
# Flaskアプリの依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# GunicornでFlaskアプリを起動
CMD ["gunicorn", "--config", "gunicorn_config.py", "app:app"]
Nginx設定ファイル (nginx/nginx.conf)
nginx.conf は、Webサーバーソフトウェア Nginx の動作を制御するためのメイン設定ファイルです。このファイルを通じて、Nginxがどのようにリクエストを処理し、どのポートで待ち受けるか、どのようなルールでファイルを提供するかなどを設定します。
events {}
http {
upstream flask {
server flask-app:5000; # Flaskアプリがリッスンするアドレス
}
server {
listen 80; # ポート80でリクエストをリッスン
server_name localhost; # サーバー名
location / {
proxy_pass http://flask;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Docker Composeファイル (docker-compose.yml)
docker-compose.yml は、複数のDockerコンテナを定義し、まとめて管理・実行するための設定ファイルです。
Docker Composeを使うことで、複数のサービス(例: Webサーバー、データベース、キャッシュサーバーなど)を簡単に構築・起動できます。
services:
flask-app:
build:
context: .
ports:
- "5000:5000"
networks:
- frontend
restart: always
nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
depends_on:
- flask-app
networks:
- frontend
networks:
frontend:
driver: bridge
Nginx+uWSGI+Flask構成への変更
GunicornからuWSGIに変更する場合、Gunicorn固有の設定をuWSGI固有の設定に置き換える必要があります。
gunicorn_config.py の削除とuwsgi.iniの作成
gunicorn_config.py を削除し、uwsgi.iniを作成します。
[uwsgi]
# サーバーのバインド設定
http-socket = 0.0.0.0:5000
# ワーカー数
processes = 3
# アプリケーションのエントリポイント
module = app:app
# 再起動時に古いワーカーを安全に終了
lazy-apps = true
# ログファイルの設定
logto = /app/uwsgi.log
Dockerfileの変更
Dockerfileを以下の通りに変更します。
# ベースイメージ
FROM python:3.8-slim
# 作業ディレクトリを設定
WORKDIR /app
# 必要なパッケージをインストール(ビルドツールを含む)
RUN apt-get update && apt-get install -y \
build-essential \
gcc \
&& rm -rf /var/lib/apt/lists/*
# 必要なファイルをコピー
COPY requirements.txt /app
COPY app.py /app
COPY uwsgi.ini /app
# Pythonの依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# uWSGIでFlaskアプリを起動
CMD ["uwsgi", "--ini", "uwsgi.ini"]
変更点:
- ビルドツールのインストール:
- uWSGIはCで実装されているため、ビルドには
gccやbuild-essentialが必要です。
- uWSGIはCで実装されているため、ビルドには
- 起動コマンドの変更:
- Gunicorn用コマンドをuWSGI用に置き換えます。
requirements.txtの変更
Flask
uWSGI
Nginx設定
Nginx設定(nginx.conf)は変更は不要です。
コンテナの起動
Dockerイメージをビルドしてコンテナを起動
以下のコマンドを実行するとコンテナが起動します。
docker-compose up --build
構成のポイント
- Nginx:
- クライアントからのリクエストを受け取り、Gunicornに転送。
- 静的ファイルの配信にも対応可能。
- Gunicorn:
- 複数のワーカーで並列処理を行い、Flaskアプリを効率的に動作。
- Flask:
- アプリケーション本体を構築し、ビジネスロジックを実装。
以上で、FlaskアプリケーションをDockerを使って本番環境に近い形でデプロイできます。

