Edited at

Djangoの環境をDocker化する(Docker + Django + Gunicorn + nginx)その1

More than 1 year has passed since last update.

大好きなPython3Djangoで開発しようと考え、Dockerを使って環境構築をしました。おおよそ1ヶ月(ハマりましたorz)ほどかかりました。そんな惨事を繰り返さないために記録しておきたいと思います。長くなりそうなので、docker-compose.ymlファイルを除く初期設定までを記載します。次回は、docker-compose.ymlを主に記載します。



環境の詳細


  • OS


    • Ubuntu16.04LTS



  • 仮想化ツール


    • Docker1.12.3



  • 言語


    • Python3.6



  • フレームワーク


    • Django1.10



  • WSGI


    • Gunicorn



  • Webサーバ


    • Nginx



  • データベース


    • PostgreSQL





初期設定



  1. プロジェクトディレクトリを作成して、その中に必要なディレクトリ構造とファイルを作成していきます。初期設定時のディレクトリ構造は以下の通りです。

    docker-django/
    
    ┣nginx
    ┃ ┗nginx.conf
    ┃ ┗mime.types

    ┣web
    ┃ ┗Dockerfile
    ┃ ┗requirements.txt
    ┗docker-compose.yml



  2. Djangoコンテナを作成するためにDockerfileを作成する。


    Dockerfile

    FROM python:3.6
    
    ENV PYTHONUNBUFFERED 1
    RUN mkdir -p /usr/src/app
    RUN mkdir -p /usr/src/app/static
    WORKDIR /usr/src/app
    ADD requirements.txt /usr/src/app/
    RUN pip install -r requirements.txt
    ADD . /usr/src/app/





  • Djangoは、Pythonのイメージから作成します。


  • ENV PYTHONUNBUFFERED 1は、python環境変数の1つです。


    • バイナリレイヤ下での標準出力とエラー出力を抑制します。(PYTHONUNBUFFERED



  • アプリケーション用のディレクトリ(/usr/src/app)と静的ファイル用のディレクトリ(/usr/src/app/static)を作成します。


  • WORKDIR /usr/src/appで作業ディレクトリを指定します。以降の処理は指定されたディレクトリ下で実行されます。


  • ADD requirements.txt /usr/src/app/requirements.txtを追加します。


  • 必要なライブラリは、requirements.txt に記載し、それらをRUN pip install -r requirements.txtを実行してライブラリをインストールします。


    requirements.txt

    Django==1.11
    
    psycopg2==2.6
    gunicorn==19.6.0



3.Nginx.confを編集する。


nginx.conf

worker_processes 1;

user nobody nogroup;
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;

events {
worker_connections 1024;
accept_mutex off;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;

upstream app_server {
server web:8000 fail_timeout=0;
}

server {
listen 80 default;
client_max_body_size 4G;
server_name localhost;

keepalive_timeout 5;

location /static/ {
alias /usr/src/app/static/;
}

location / {
try_files $uri @proxy_to_app;
}

location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_pass http://app_server;
}

     # エラー用の静的ファイルは、適宜変更する。
error_page 500 502 503 504 /500.html;
location = /500.html {
root /path/to/app/current/public;
}
}
}




  • mime.typesファイルの読み込みを行う。


mime.types

   types {

text/html html htm shtml;
text/css css;
text/xml xml rss;
image/gif gif;
image/jpeg jpeg jpg;
application/x-javascript js;
text/plain txt;

===== 以下、省略 =====
}




  • upstreamディレクティブにて、アクセスを振り分けるサーバを定義する。


  • location /staticディレクティブにて、静的ファイルのパスを定義する。


  • location @proxy_to_appディレクティブにて、接続するアプリヶーションサーバを指定する。

次回は、docker-compose.ymlを主に記載します。