【Django】DockerでDjango+Gunicorn+Nginx+MySQLの環境構築をする

作成日: 更新日:

開発環境

  • Visual Studio Code:version 1.73.0
  • OS:Windows10
  • Docker Engine:v23.0.5

DockerでDjango+Gunicorn+Nginx+MySQLの環境構築をする手順

DockerでDjango+Gunicorn+Nginx+MySQLの環境構築をする手順について解説していきます。

ディレクトリ構成

今回のディレクトリ構成は下記を目指していきます。

1# Directory structure
2project-root/
3├── docker/
4│   ├── web/             # Pythonコンテナ(Dockerfile)
5│   ├── database/        # MySQLコンテナ(Dockerfile)
6│   └── nginx/           # Nginxコンテナ(Dockerfile + 設定ファイル)
7├── web/                 # Djangoプロジェクトを配置するディレクトリ
8└── docker-compose.yml   # Docker Composeファイル

docker-compose.ymlを作成

まずはdocker-compose.ymlを作成していきます。 ルートディレクトリの直下にdocker-compose.ymlを作成し、以下のようにしてください。

1# docker-compose.yml
2version: '3.8'
3
4services:
5  web:
6    build:
7      context: .
8      dockerfile: docker/web/Dockerfile
9    container_name: django_web
10    ports:
11      - "8000:8000"
12    volumes:
13      - ./web:/var/www/html

Pythonコンテナを作成

次にPythonコンテナを作成していきます。 docker/web/ディレクトリの直下にDockerfileを作成し、以下のようにしてください。

1# docker/web/Dockerfile
2FROM python:3.11
3
4WORKDIR /var/www/html
5
6COPY ./docker/web/requirements.txt /var/www/html/
7
8RUN pip install --upgrade pip
9RUN pip install -r requirements.txt

docker/web/ディレクトリの直下にrequirements.txtを作成し、以下のようにしてください。

1# docker/web/requirements.txt
2Django
3mysqlclient
4gunicorn

Djangoプロジェクトの作成

次にDjangoプロジェクトの作成をしていきます。 まずは以下のコマンドでプロジェクトディレクトリに移動します。

1cd project-root

以下のコマンドでPythonコンテナをビルドします。

1docker-compose build

以下のコマンドでDjangoプロジェクトを作成します。

1docker-compose run --rm web django-admin startproject config .

Pythonコンテナの修正

次にPythonコンテナを修正していきます。

1# docker/web/Dockerfile
2FROM python:3.11
3
4WORKDIR /var/www/html
5
6COPY ./docker/web/requirements.txt /var/www/html/
7
8RUN pip install --upgrade pip
9RUN pip install -r requirements.txt
10
11+ CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"]

MySQLコンテナを作成

次にMySQLコンテナを作成していきます。 docker/database/ディレクトリの直下にDockerfileを作成し、以下のようにしてください。

1# docker/database/Dockerfile
2FROM mysql:8.0

Nginxコンテナを作成

次にNginxコンテナを作成していきます。 docker/nginx/ディレクトリの直下にDockerfileを作成し、以下のようにしてください。

1# docker/nginx/Dockerfile
2FROM nginx:alpine
3COPY ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf

docker/nginx/ディレクトリの直下にdefault.confを作成し、以下のようにしてください。

1# docker/nginx/default.conf
2server {
3    listen 80;
4    server_name localhost;
5
6    location / {
7        proxy_pass http://web:8000;
8        proxy_set_header Host $host;
9        proxy_set_header X-Real-IP $remote_addr;
10        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
11    }
12}

docker-compose.ymlを修正

docker-compose.ymlを修正していきます。 ルートディレクトリの直下のdocker-compose.ymlを以下のように修正してください。

1# docker-compose.yml
2version: '3.8'
3
4services:
5  web:
6    build:
7      context: .
8      dockerfile: docker/web/Dockerfile
9    container_name: django_web
10    ports:
11      - "8000:8000"
12    volumes:
13      - ./web:/var/www/html
14+     depends_on:
15+       - db
16+ 
17+   db:
18+     build:
19+       context: .
20+       dockerfile: docker/database/Dockerfile
21+     container_name: django_db
22+     environment:
23+       MYSQL_ROOT_PASSWORD: root_password
24+       MYSQL_DATABASE: django_db
25+       MYSQL_USER: django_user
26+       MYSQL_PASSWORD: django_password
27+     ports:
28+       - "3306:3306"
29+     volumes:
30+       - db_data:/var/lib/mysql
31+ 
32+   nginx:
33+     build:
34+       context: .
35+       dockerfile: docker/nginx/Dockerfile
36+     container_name: django_nginx
37+     ports:
38+       - "80:80"
39+     depends_on:
40+       - web
41+     volumes:
42+       - ./web:/var/www/html
43+       - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
44+ 
45+ volumes:
46+   db_data:

Dockerコンテナをビルド

次にDockerコンテナをビルドしていきます。 まずは以下のコマンドでプロジェクトディレクトリに移動します。 ※プロジェクトディレクトリに移動済の場合はスキップしてください。

1cd project-root

以下のコマンドでDockerコンテナをビルドします。

1docker-compose build --no-cache

Djangoプロジェクトのデータベース設定

次にDjangoプロジェクトのデータベース設定をしていきます。 Djangoプロジェクトのsettings.py設定を以下のように修正します。

1# web/config/settings.py
2DATABASES = {
3    'default': {
4        'ENGINE': 'django.db.backends.mysql',
5        'NAME': 'django_db',
6        'USER': 'django_user',
7        'PASSWORD': 'django_password',
8        'HOST': 'db',
9        'PORT': '3306',
10    }
11}

次に以下のコマンドでマイグレーションを実行します。

1docker-compose exec web python manage.py migrate

ブラウザでhttp://localhostにアクセスし、Djangoアプリケーションの初期画面が表示されていれば成功です。

まとめ

今回はDockerでDjangoの環境構築をする手順について解説していきましたが、いかがだったでしょうか。 個人開発のみであればDockerは不要かもしれませんが、Dockerコンテナで開発環境を構築することにより、複数人でプロジェクトを進める場合でも同じ環境で開発を進めることができます。 Dockerを使った開発は必須となりつつありますので、是非、チャレンジしてみてください。

【Django】DockerでDjango+Gunicorn+Nginx+MySQLの環境構築をする | いっしー@Webエンジニア