Nginx+uwsgi+Flaskをdockerで動かす †
概要 †Nginx+wgsi+Flaskで動作させる為の Dockerイメージを作成する。
インターネット ⇔ Dockerホスト ⇔ Dockerコンテナ ⇔ Nginx ⇔ uwsgi ⇔ Flask
まずはローカルで uwsgi で動かしてみる †いったん uwsgi のみで動作するかローカルで確認する。 作業用フォルダの作成 †まずは、作業用フォルダを作成する。 mkdir test_flask cd test_flask 必要なものをインストール †python3 -m venv .venv source .venv/bin/activate pip install flask pip install uwsgi サンプルアプリケーションの作成 †app/app.py from flask import Flask import datetime app = Flask(__name__) @app.route('/') def index(): now = datetime.datetime.now().strftime('%H:%M:%S.%f') return f'<h1>top page!({now})</h1>\n' @app.route('/sample') def sample(): now = datetime.datetime.now().strftime('%H:%M:%S.%f') return f'<h1>sample page!({now})</h1>\n' uwsgiのみで動かしてみる †参考 uwsgi起動 uwsgi --http :3031 --wsgi-file app/app.py --callable app 確認 curl http://localhost:3031/ top page!(13:35:03.767707) Dockerイメージ †ここからは実際に dockerイメージを作っていく。 フォルダ構成 †静的ファイルを含めて全て /var/app 配下に配置する。 ローカルの作業フォルダ . 作成するdockerイメージ /var/app アプリケーションの作成 †app/app.py rom flask import Flask, render_template import datetime app = Flask(__name__) @app.route('/') def index(): now = datetime.datetime.now().strftime('%H:%M:%S.%f') return render_template('page.html', page_name='top page!', time=now) @app.route('/sample') def sample(): now = datetime.datetime.now().strftime('%H:%M:%S.%f') return render_template('page.html', page_name='sample page!', time=now) app/templates/base.html <!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <head> {% block head %} <link rel="stylesheet" href="/static/style.css" /> <title>{% block title %}{% endblock %} - My Webpage</title> {% endblock %} </head> <body> <div id="content">{% block content %}{% endblock %}</div> <div id="footer"> {% block footer %} © Copyright Sample. {% endblock %} </div> </body> </html> app/templates/page.html {% extends "base.html" %} {% block content %} <h1>{{page_name}}({{time}})</h1> {% endblock %} app/static/style.css h1 { color: red; } 起動用シェルの作成 †app/startup.sh #!/bin/bash # アプリケーションディレクトリに移動 cd /var/app # uwsgi起動 # TODO: rootで動かさない方が良いですよ。というWarningが出るので、ちゃんと uid 等を指定した方が良い uwsgi --socket 127.0.0.1:3031 --chdir /var/app/ --wsgi-file app.py --callable app --master --processes 4 --threads 2 & # nginx起動 nginx -g "daemon off;" Nginxの設定ファイル作成 †default.conf server { listen 80; server_name localhost; root /var/app; index index.html index.htm; # Flaskアプリケーションは uwsgi に処理を任せる location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3031; } # /static配下はNginxが直接配信 location ^~ /static/ { include /etc/nginx/mime.types; root /var/app; } } Dockerファイルの作成 †Dockerfile FROM ubuntu USER root # 必要なものをインストール RUN apt-get update && \ apt-get -y install software-properties-common && \ add-apt-repository -y ppa:jonathonf/python-3.6 && \ apt-get update && \ apt-get -y install nginx && \ apt-get -y install python3.6-dev && \ apt-get -y install python3-pip # PythonのPATH設定 RUN ln -s /usr/bin/python3.6 /usr/bin/python RUN rm -rf /usr/bin/python3 && ln -s /usr/bin/python3.6 /usr/bin/python3 # flask、uwsgiをインストール RUN pip3 install --upgrade pip && pip install flask && pip install uwsgi # アプリケーションをコピー COPY app /var/app # Nginxの設定ファイルをコピー COPY default.conf /etc/nginx/conf.d/default.conf # 起動 CMD ["/bin/bash", "/var/app/startup.sh"] dockerイメージのビルド †docker build ./ -t app_nginx_uwsgi dockerコンテナの起動 †sudo docker run -p 8080:80 app_nginx_uwsgi |