【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を使った開発は必須となりつつありますので、是非、チャレンジしてみてください。