Python
Django
nginx
docker

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

前回は、nginx.confまでを記載しました。今回は、docker-compose.ymlを中心に嵌りどころも含めて書いていきたいと思います。

下記で公開中です。記事と合わせて参考にしてください。
Dockerize Django Environment


docker-compose.ymlの初期設定

docker-compose.yml
version: '2'
services:
  web:
   restart: always
   build: ./web
   expose:
     - "8000"
   links:
     - postgres:postgres
   command: gunicorn app.wsgi -b 0.0.0.0:8000
   volumes:
     - ./web:/usr/src/app
     - ./web/static/:/usr/src/app/static
  nginx:
    restart: always
    image: nginx
    ports:
      - "80:80"
    volumes:
      - "./nginx/:/etc/nginx/"
      - /www/static
    volumes_from:
      - web
    links:
      - web:web
  postgres:
   image: postgres
   ports:
     - "5432:5432"
  1. Django用コンテナの定義(サービス名:web)
  • 前回のディレクトリ構造にて、Django用ディレクトリをwebとしました。その中ににあるDockerfileをからビルドします。
  • EXPOSE命令で、特定のネットワークポート(今回は、8000)をコンテナ実行時に公開することをdockerに伝えます。
  • LINKS命令で、コンテナを他のサービスと連携します。(今回は、 postgres
  • command命令で、コンテナ実行時に実行されるcommandを上書きします。(今回は、gunicorn app.wsgi -b 0.0.0.0:8000)※gunicornについては別途記載します。
  • volumes命令で、指定したディレクトリがボリュームであることを宣言します。(ホスト:コンテナ)の関係で指定しています。
    • ./web:/usr/src/appDjangoアプリケーションディレクトリを指定します。
    • ./web/static/:/usr/src/appstaticで静的ファイルディレクトリを指定します。

2.Nginx用コンテナの定義(サービス名:nginx)

  • IMAGE命令で、タグもしくはイメージIDを指定し、pullします。今回は、nginxイメージをpullします。
  • PORTS命令で、ホストの80番ポートとコンテナの80番ポートをフォワードするように指示します。
  • VOLUMES命令で、ホストのnginxディレクトリ配下にあるnginx.confファイルをコンテナの/etc/nignxディレクトリにコピーするように指示します。
  • VOLUMES命令で、/www/staticディレクトリを明示的にボリュームとして使用することを宣言します。(静的ファイルを格納しているディレクトリ)
  • VOLUMES_FROM命令で、Web(Django用ディレクトリ)をマウントするように指示します。(静的ファイルを取り込むため)

3.PostgreSQL用コンテナの定義(サービス名:postgres)

  • postgresイメージをpullします。
  • PORTS命令で、ホストの5432番ポートとコンテナの5432番ポートをフォワードするように指示します。

嵌りポイント

  1. 静的ファイルのディレクトリを明示的にボリュームとして宣言しないと静的ファイルを配信できない。

次回は、Djangoフレームワークの初期設定を記載します。