コンテンツにスキップ

Django × Docker × Gunicorn × NginxでWebアプリケーションをデプロイする方法

この記事では、Djangoで作成したWebアプリケーションをDockerコンテナ上で動作させ、GunicornとNginxを使ってWebアプリケーションをデプロイする方法について解説します。

準備

ディレクトリ構成

この記事では、以下のディレクトリ構成を想定して説明します。

uml diagram

ローカル環境での動作確認

まずは、ローカル環境に上記の構成でデプロイして動作確認を行います。 Djangoプロジェクトの設定は済んでいるものとします。

DockerとDocker Composeのインストール

DockerとDocker Composeをインストールします。 手順はこちらを参考にしてください。

Dockerfileの作成

DjangoアプリケーションをDockerコンテナ上で動作させるためのDockerfileを作成します。

Dockerfile
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Dockerfile
FROM python:3.11-slim

RUN mkdir /code

WORKDIR /code

COPY requirements.txt .

RUN python3 -m venv /.venv && \
    . /.venv/bin/activate && \
    pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

COPY . .
COPY entrypoint.sh /entrypoint.sh

RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

docker-compose.ymlの作成

Docker Composeを使って、DjangoアプリケーションとNginxを起動するためのdocker-compose.ymlを作成します。

docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3'

services:
  web:
    build: ..
    volumes:
      - ..:/code
    expose:
      - "8080"
    env_file:
      - ../.env
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ../static:/code/static
      - ../media:/code/media
    depends_on:
      - web

volumes:
  postgres_data:

entrypoint.shの作成

Djangoアプリケーションを起動するためのentrypoint.shを作成します。

entrypoint.sh
1
2
3
4
5
#!/bin/sh
. /.venv/bin/activate
cd /code
python3 manage.py collectstatic --noinput
exec gunicorn --bind 0.0.0.0:8080 config.wsgi:application

Nginxの設定

Nginxの設定ファイルnginx/default.confを作成します。

local/nginx/default.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://web:8080;  # ポート 8080 に変更
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /static/ {
        alias /code/static/;
    }

    location /media/ {
        alias /code/media/;
    }
}

.envファイルの作成

Djangoアプリケーションの環境変数を設定するための.envファイルを作成します。

.env
1
2
3
DEBUG=False
ALLOWED_HOSTS=localhost
SECRET_KEY=your_secret_key

Djangoアプリケーションの起動

Djangoアプリケーションを起動します。

bash
1
docker-compose up --build -d

http://localhostにアクセスして、Djangoアプリケーションが正常に動作していることを確認します。

コメント