【Docker】Nginx+uWSGI+Flaskのコンテナ構築

はじめに

Nginx+uWSGI+FlaskのWebサーバをDocker Composeで構築していきます。

Nginx+uWSGI+FlaskのWebサーバの構築についてはこちらを参照ください。

Flask+uWSGI+NginxでWSGIを試してみる
はじめにWSGIについて理解するために、Flask+uWSGI+NginxでWebサーバを構築してみます。WSGIとはWSGI(Web Server Gateway Interface)とは、PythonのWebアプリケーションとWe...

構成

今回は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アプリが表示されるようになっています。

参考

タイトルとURLをコピーしました