docker-composeでflask+uwsgi+nginxの環境を構築する

2021年9月11日

おはこんばんにちは、せなです。

最近、個人で開発するときにdockerをよく使用するので、その際に使用しているテンプレートをメモがわりに記載します。

※ちなみに当方はM1 Macを使用していますので、参考までに

環境

Python3.8
flask
nginx
uWsgi

構造

/
docker-compose.yml
- app
  - Dockerfile
  - uwsgi.ini
  - requirements.txt
  - app.py
    - views
      - hogeview.py
- web
  - Dockerfile
  - nginx.conf

下にそれぞれのファイル内容を記載しますので、コピペで使用してみてください。

ファイル内容

docker-compose

version: "3"

services:
    app:
        restart: always
        container_name: app-server
        hostname: app-server
        build: ./app
        volumes:
            - "./app:/var/www/"
        ports:
            - "3031:3031"
        environment:
            TZ: Asia/Tokyo
    web:
        container_name: web-server
        hostname: web-server
        build: ./web
        volumes:
            - "./web/nginx.conf:/etc/nginx/nginx.conf"
            - "/tmp/nginx_log:/var/log/nginx"
        ports:
            - "4231:80"
        environment:
            TZ: Asia/Tokyo

app container

Dockerfile

# base image
FROM python:3.8.5
USER root

ARG project_dir=/var/www/

# workdir にファイル等追加
COPY requirements.txt $project_dir

# workdir
WORKDIR $project_dir

RUN apt-get update
RUN apt-get -y install locales && \
  localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

CMD ["uwsgi","--ini","/var/www/uwsgi.ini"]

requirements.txt

Flask
uwsgi

uwsgi.ini

[uwsgi]
# pythonモジュールのインポート
app = app:create_app()
module = %(app)

callable = app
master = true
processes = 1
socket = :3031

logto = /var/log/app-server.log

master = true
processes = 10
vaccum = true
die-on-term = true
max-requests = 100
harakiri = 60

reload-mercy = 5
worker-reload-mercy = 5

ignore-sigpipe=true
ignore-write-errors=true
disable-write-exception=true

app.py

from flask import Flask
from views import hogeview

def create_app():
    app = Flask(__name__)
    app.register_blueprint(hoge.bp)
    return app

if __name__ == "__main__":
    create_app().run(debug=True, host='0.0.0.0')

hogeview.py

from flask import Blueprint

bp = Blueprint('hoge', __name__, url_prefix='/hoge')

@bp.route('/', methods=['GET', 'POST'])
def hello():
    return 'Hello World!'

web container

Dockerfile

# base image
FROM nginx:latest

CMD ["nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]

nginx.conf

# 実行ユーザー
user  nginx;
# 使用可能process数
worker_processes  1;

# エラーログの設定
error_log  /var/log/nginx/error.log warn;
# processidの格納先
pid        /var/run/nginx.pid;

# イベント処理モジュール
events {
    # 最大接続数
    worker_connections  1024;
}

# http関連のモジュール
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    #sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream uwsgi {
        server app-server:3031;
    }

    server {
        listen 80;
        charset utf-8;

        location / {
            include uwsgi_params;
            uwsgi_pass uwsgi;
        }

    }
}

docker-composeの実行方法

色々なサイトで実行方法は載っているので簡単にコマンドをまとめておきます。

docker-compose.ymlのあるフォルダに移動してから以下のコマンドを行います。

  1. docker-compose build でビルドを行う
  2. docker-compose up -d で実行
  3. http://localhost:4231/test にアクセス
  4. Hello World と表示される
  5. docker-compose down で終了

logを見たいときには docker-compose exec app bash または docker-compose exec web bash

最後に

とりあえず、コピーして使用できる程度のものですが記載させて頂きました。
どなたかの役に立てば幸いです。

ではでは〜