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

2021.09.20
2024.03.24
Docker
Docker ComposeflasknginxuWSGI

はじめに

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

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

Flask+uWSGI+NginxでWSGIを試してみる

Flask+uWSGI+NginxでWSGIを試してみる

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

構成

今回はNginxのコンテナとuWSGI+Flaskのコンテナの構成で構築します。

アプリケーション

uWSGI+Flaskコンテナのアプリケーション部分のコンテナに必要なファイルを用意します。

まずはアプリケーションに必要なファイルを格納するappディレクトリとapp/flaskappディレクトリを作成します。

1mkdir app
2
3mkdir app/flaskapp

Flaskアプリ部分となるapp/flaskapp/app.pyを作成します。

1from flask import Flask
2
3app = Flask(__name__)
4
5
6@app.route('/')
7def index():
8    return '<h2>Hello Flask+uWSGI+Nginx</h2>'
9
10
11if __name__ == "__main__":
12    app.run(host='0.0.0.0')

次にFlaskアプリを呼び出すapp/flaskapp/wsgi.pyを作成します。

1from app import app
2
3if __name__ == '__main__':
4    app.run()

uWSGIの設定ファイルとなるapp/flaskapp/app.iniを作成します。

1[uwsgi]
2module = wsgi:app
3master = true
4socket = /tmp/uwsgi.sock
5chmod-socket = 666
6wsgi-file = /app/wsgi.py
7logto = /app/uwsgi.log

必要なライブラリをインストールするためのapp/flaskapp/requirements.txtを作成します。

1flask==2.0.1
2uWSGI==2.0.19.1

最後にapp/Dockerfileを作成します。app/flaskapp/requirements.txtをコピーしてライブラリをインストールしてます。

1FROM python:3.9.7
2
3WORKDIR /app
4ENV FLASK_APP=app
5
6COPY ./flaskapp/requirements.txt ./
7
8RUN pip install --upgrade pip
9RUN pip install -r requirements.txt

ディレクトリ構成は以下のようになります。

1.
2└── app
3    ├── Dockerfile
4    └── flaskapp
5        ├── app.ini
6        ├── app.py
7        ├── requirements.txt
8        └── wsgi.py

Nginx

次にNginxコンテナに必要なファイルを用意します。

まずは必要なファイルを格納するwebディレクトリを作成します。

1mkdir web

Nginxの設定ファイルであるweb/nginx.confを作成します。

1server {
2    listen       80;
3    listen  [::]:80;
4    server_name  localhost;
5
6    location / {
7        include uwsgi_params;
8        uwsgi_pass unix:/tmp/uwsgi.sock;
9    }
10
11    error_page   500 502 503 504  /50x.html;
12    location = /50x.html {
13        root   /usr/share/nginx/html;
14    }
15}

ディレクトリ構成は以下のようになります。

1.
2├── app
3│   ├── Dockerfile
4│   └── flaskapp
5│       ├── app.ini
6│       ├── app.py
7│       ├── requirements.txt
8│       └── wsgi.py
9└── web
10    └── nginx.conf

Docker Compose

最後にuWSGI+FlaskコンテナとNginxコンテナを実行するためのdocker-compose.ymlを用意します。

1version: "3"
2services:
3  app:
4    build: ./app
5    volumes:
6      - ./app/flaskapp:/app
7      - socket:/tmp
8    command: uwsgi --ini /app/app.ini
9
10  web:
11    image: nginx:latest
12    ports:
13      - "80:80"
14    volumes:
15      - ./web/nginx.conf:/etc/nginx/conf.d/default.conf
16      - socket:/tmp
17
18volumes:
19  socket:

共通のボリュームを利用してソケット通信をしています。 また、必要なファイルはそれぞれホストからマウントしています。

最終的なディレクトリ構成は以下のようになります。

1.
2├── app
3│   ├── Dockerfile
4│   └── flaskapp
5│       ├── app.ini
6│       ├── app.py
7│       ├── requirements.txt
8│       └── wsgi.py
9├── docker-compose.yml
10└── web
11    └── nginx.conf

実行

必要なファイルが準備できたので、Docker Composeで実行してみます。

1docker-compose up -d
2[+] Running 4/4
3 ⠿ Network nginx-uwsgi-flask_default  Created                     0.1s
4 ⠿ Volume "nginx-uwsgi-flask_socket"  Created                     0.0s
5 ⠿ Container nginx-uwsgi-flask_app_1  Started                     0.8s
6 ⠿ Container nginx-uwsgi-flask_web_1  Started                     0.8s

http://localhostにアクセスするとflaskアプリが表示されるようになっています。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee