Django
nginx
docker
python3

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

大好きな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を主に記載します。