はじめに
Nginx+uWSGI+FlaskのWebサーバをDocker Composeで構築していきます。
Nginx+uWSGI+FlaskのWebサーバの構築についてはこちらを参照ください。

構成
今回はNginxのコンテナとuWSGI+Flaskのコンテナの構成で構築します。
アプリケーション
uWSGI+Flaskコンテナのアプリケーション部分のコンテナに必要なファイルを用意します。
まずはアプリケーションに必要なファイルを格納するapp
ディレクトリとapp/flaskapp
ディレクトリを作成します。
❯ mkdir app
❯ mkdir app/flaskapp
Flaskアプリ部分となるapp/flaskapp/app.py
を作成します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h2>Hello Flask+uWSGI+Nginx</h2>'
if __name__ == "__main__":
app.run(host='0.0.0.0')
次にFlaskアプリを呼び出すapp/flaskapp/wsgi.py
を作成します。
from app import app
if __name__ == '__main__':
app.run()
uWSGIの設定ファイルとなるapp/flaskapp/app.ini
を作成します。
[uwsgi]
module = wsgi:app
master = true
socket = /tmp/uwsgi.sock
chmod-socket = 666
wsgi-file = /app/wsgi.py
logto = /app/uwsgi.log
必要なライブラリをインストールするためのapp/flaskapp/requirements.txt
を作成します。
flask==2.0.1
uWSGI==2.0.19.1
最後にapp/Dockerfile
を作成します。app/flaskapp/requirements.txt
をコピーしてライブラリをインストールしてます。
FROM python:3.9.7
WORKDIR /app
ENV FLASK_APP=app
COPY ./flaskapp/requirements.txt ./
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ディレクトリ構成は以下のようになります。
.
└── app
├── Dockerfile
└── flaskapp
├── app.ini
├── app.py
├── requirements.txt
└── wsgi.py
Nginx
次にNginxコンテナに必要なファイルを用意します。
まずは必要なファイルを格納するweb
ディレクトリを作成します。
❯ mkdir web
Nginxの設定ファイルであるweb/nginx.conf
を作成します。
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
ディレクトリ構成は以下のようになります。
.
├── app
│ ├── Dockerfile
│ └── flaskapp
│ ├── app.ini
│ ├── app.py
│ ├── requirements.txt
│ └── wsgi.py
└── web
└── nginx.conf
Docker Compose
最後にuWSGI+FlaskコンテナとNginxコンテナを実行するためのdocker-compose.yml
を用意します。
version: "3"
services:
app:
build: ./app
volumes:
- ./app/flaskapp:/app
- socket:/tmp
command: uwsgi --ini /app/app.ini
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./web/nginx.conf:/etc/nginx/conf.d/default.conf
- socket:/tmp
volumes:
socket:
共通のボリュームを利用してソケット通信をしています。
また、必要なファイルはそれぞれホストからマウントしています。
最終的なディレクトリ構成は以下のようになります。
.
├── app
│ ├── Dockerfile
│ └── flaskapp
│ ├── app.ini
│ ├── app.py
│ ├── requirements.txt
│ └── wsgi.py
├── docker-compose.yml
└── web
└── nginx.conf
実行
必要なファイルが準備できたので、Docker Composeで実行してみます。
❯ docker-compose up -d
[+] Running 4/4
⠿ Network nginx-uwsgi-flask_default Created 0.1s
⠿ Volume "nginx-uwsgi-flask_socket" Created 0.0s
⠿ Container nginx-uwsgi-flask_app_1 Started 0.8s
⠿ Container nginx-uwsgi-flask_web_1 Started 0.8s
http://localhost
にアクセスするとflaskアプリが表示されるようになっています。