Webサーバコンテナの作成

ここからは本番環境を想定し、WebサーバとしてNginxのコンテナを追加します。

ディレクトリとファイルを作成します。

mkdir -p docker/web/conf.d
touch docker/web/conf.d/default.conf
touch docker/.env.prod
touch docker-compose.prod.yml
docker/web/conf.d/default.conf
 1upstream django {
 2    server app:8000;
 3}
 4
 5server {
 6    listen 80;
 7    server_name 0.0.0.0;
 8    location / {
 9        proxy_pass http://django;
10        proxy_set_header Host $host;
11        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
12        proxy_redirect off;
13    }
14}
docker/.env.prod
1TZ='Asia/Tokyo'
2MYSQL_DATABASE=mysite
3MYSQL_USER=django
4MYSQL_ROOT_PASSWORD=root
5MYSQL_PASSWORD=django
6SECRET_KEY=django
7DEBUG=False
docker-compose.prod.yml
 1version: '3.9'
 2services:
 3  app:
 4    container_name: django
 5    build:
 6      dockerfile: ./docker/app/Dockerfile
 7    env_file: ./docker/.env.prod
 8    command: poetry run gunicorn mysite.wsgi:application --bind 0.0.0.0:8000
 9    depends_on:
10      db:
11        condition: service_healthy
12  db:
13    container_name: mysql
14    image: mysql:8
15    volumes:
16      - ./docker/db/data:/var/lib/mysql
17      - ./docker/db/conf.d:/etc/mysql/conf.d
18    env_file: ./docker/.env.prod
19    ports:
20      - "3306:3306"
21    privileged: true
22    healthcheck:
23      test: mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD
24      interval: 10s
25      timeout: 10s
26      retries: 3
27      start_period: 30s
28  web:
29    container_name: nginx
30    image: nginx
31    volumes:
32      - ./docker/web/conf.d:/etc/nginx/conf.d
33    ports:
34      - 80:80
35    depends_on:
36      - app

コンテナを起動します。

docker compose -f docker-compose.prod.yml up -d

コンテナが起動していることを確認します。

docker compose -f docker-compose.prod.yml ps
NAME                IMAGE                      COMMAND                  SERVICE             CREATED             STATUS                    PORTS
django              django-docker-sample-app   "poetry run gunicorn…"   app                 32 minutes ago      Up 32 minutes             0.0.0.0:8000->8000/tcp, :::8000->8000/tcp
mysql               mysql:8                    "docker-entrypoint.s…"   db                  32 minutes ago      Up 32 minutes (healthy)   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx                      "/docker-entrypoint.…"   web                 32 minutes ago      Up 32 minutes             0.0.0.0:80->80/tcp, :::80->80/tcp

ログにエラーがないことを確認します。

docker compose -f docker-compose.prod.yml logs

マイグレーションファイルを生成します。

docker compose -f docker-compose.prod.yml exec app poetry run python manage.py makemigrations

マイグレーションを実行します。

docker compose -f docker-compose.prod.yml exec app poetry run python manage.py migrate

http://localhost/polls/ にアクセスできることを確認します。

コンテナを終了します。

docker compose -f docker-compose.prod.yml down