Contents
Django 本番環境デプロイ:Docker Composeによる手順ガイド
Djangoアプリケーションの本番環境構築には、Docker Compose + Nginx + PostgreSQLのスタックが有効です。Nginxとの連携やセキュリティ設定など、公式ドキュメントにない補完情報が必要な場面も多いため、具体的なコード例とベストプラクティスを交えながら解説します。
Docker ComposeによるDjangoデプロイの基本構成
Docker Compose + Nginx + PostgreSQLのスタックは、本番環境での安定性と拡張性を確保するための標準的な構成です。以下に各コンテナの役割を整理します。
| コンポーネント | 役割 | 重要ポイント |
|---|---|---|
| Webコンテナ | Djangoアプリの実行・Gunicorn経由でのリクエスト処理 | depends_onでDBとの通信順序を制御 |
| DBコンテナ | PostgreSQLによるデータ永続化 | ボリュームを使用したデータ保存必須 |
| Nginxコンテナ | HTTPリバースプロキシ・SSL証明書管理 | Let's Encryptと連携したHTTPS設定が推奨 |
注意: DBコンテナのボリュームは外部マウントでないと再起動時にデータが消えます。
docker-compose.ymlの構築手順
Djangoアプリケーションを効率的にデプロイするには、docker-compose.ymlの正しい設定が不可欠です。以下の3ステップで構成します。
- 基本サービス定義: Web, DB, Nginxの各コンテナを定義
- 環境変数管理:
.envファイルによるセキュリティ強化 - 永続化・バックアップ設定: ボリュームと自動バックアップスクリプトの導入
環境変数の読み込み方法(.envファイル)
.envファイルはDocker Composeで自動的に読み込まれるため、以下のように定義します。
|
1 2 3 4 5 6 7 |
DJANGO_SETTINGS_MODULE=myproject.settings.prod DB_HOST=db DB_NAME=mydb DB_USER=myuser DB_PASSWORD=mypassword SECRET_KEY=your-secret-key-here |
重要:
docker-compose.ymlの環境変数指定は${VARIABLE}と記述し、.envファイルを同ディレクトリに配置します。
PostgreSQLデータベースの永続化設定
データベースの再起動時にもデータを保持するためにはボリューム設定が必須です。以下のようにdocker-compose.ymlに定義してください。
|
1 2 3 |
volumes: db_data: |
注意: ボリュームはホスト側にマウントされるため、コンテナ削除後でもデータを復元可能です。
自動バックアップスクリプト
定期的なバックアップは以下の手順で実施します。
- ホストマシンにバックアップスクリプトを作成
cronで自動実行設定
|
1 2 3 |
#!/bin/bash docker exec -t db pg_dump -U myuser mydb > /backup/mydb_$(date +%Y%m%d).sql |
注意: バックアップファイルはホスト側の
/backupディレクトリに保存されるため、セキュリティ対策が必要です。
NginxとLet's EncryptによるHTTPS設定
Nginxでは、Let's Encryptの証明書を使用してHTTPS通信を実現できます。以下は主な手順です。
設定ファイル例(nginx.conf)
|
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 |
server { listen 80; server_name yourdomain.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } return 301 https://$host$request_uri; } server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://web:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } |
Let's Encryptの自動更新処理
証明書は90日ごとに更新が必要ですが、ホストマシンでのcron設定が必須です。以下のようにスクリプトを設定します。
|
1 2 |
0 0 * * * docker exec nginx certbot renew --webroot -w /var/www/certbot |
重要: cronはホストマシンで実行されるため、
docker-compose.yml内での自動更新は不可です。
静的ファイルのNginx配信設定
Djangoの静的ファイルはNginxに直接配置することで効率化できます。以下のように構成します。
Nginx設定例(staticファイル配信)
|
1 2 3 4 5 |
location /static/ { alias /app/static/; expires 30d; } |
補足:
expiresディレクティブでキャッシュ期間を指定し、ロードタイムの削減が可能です。
結論と今後の注意点
- デプロイ構成は
docker-compose.ymlの正確な記述に依存 - セキュリティ面では
.envファイル活用と環境変数管理を徹底 - 証明書更新はホスト側cronで自動化が必須
- 静的ファイルはNginxでの配信がパフォーマンス向上に寄与
本記事の手順に従ってデプロイし、コメント欄で実施時の課題を共有してください。