はじめに
本記事は最低限の設定でDocker上にNginx, Django, Postgesql環境を構築するガイドです。
ここでいう最低限の設定とはport番号、ユーザー名などデフォルトで設定されているものはデフォルトのものをそのまま利用し、一般的に柔軟性を持たせるために作成する環境変数などもハードコーディング等で済ませてしまいます。
そのためここで構築する環境は開発環境、運用環境、どちらにも適しませんが、Dockerのベースを抑えるための学習目的、あるいはカスタムのベースにするためのものです。
今回の環境
Windows機で試していますが、DockerはWSL上のUbuntu-24.04にインストールしたものを使います。
企業の場合は、WindowsのDockerは有償なので。
Djangoプロジェクトの立ち上げ
必要なライブラリを記載するためにrequirements.txt
をルートのフォルダに作ります。
Django
gunicorn
psycopg2-binary
ソースコードを保管するディレクトリを作成します。
mkdir src
Djangoのみインストールし、Djangoのプロジェクトを立ち上げます。
pip install django
django-admin startproject setting ./src
./src/setting/settings.py
のDATABASE
とALLOWED_HOSTS
とSTATIC_ROOT
を以下のように書き換えます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': "postgres",
'USER': "postgres",
'PASSWORD': "postgres",
'HOST': "db",
'PORT': "5432",
}
}
ALLOWED_HOSTS = ['app']
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
最終的に以下のようなディレクトリ構造になっているはずです。
./
├── src/
│ └── setting/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
Docker関連ファイルの作成
事前に、docker-compose.yml
をルートフォルダの中に作ります
postgresqlの設定
以下の内容を追加します。
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: postgres
ポイント
- ユーザ名を指定しない場合、自動的に
postgres
になります - データベース名を指定しない場合、自動的に
postgres
になります
djangoの設定
以下の内容を追加します。
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./src:/app
- ./entrypoint.sh:/app/entrypoint.sh
depends_on:
- db
Dockerfile
をルートフォルダの中に作ります。
FROM python
WORKDIR /app
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ENTRYPOINT ["./entrypoint.sh"]
entrypoint.sh
をルートフォルダの中に作ります。
#!/bin/sh
python manage.py makemigrations --noinput
python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn setting.wsgi:application --bind 0.0.0.0:8000
Nginxの設定
以下の内容を追加します。
web:
image: nginx:latest
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
- ./src/static:/app/static
ports:
- "80:80"
depends_on:
- app
default.sh
をルートフォルダの中に作ります。
upstream app {
server app:8000;
}
server {
listen 80;
server_name 0.0.0.0;
location / {
proxy_pass http://app;
}
location /static/ {
alias /app/static/;
}
}
構成確認
最終的に以下のようなディレクトリ構成になっていると思います。
./
├── default.conf
├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
├── requirements.txt
├── src/
│ ├── manage.py
│ ├── setting/
│ │ ├── __init__.py
│ │ ├── asgi.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
またdocker-compose.yml
の内容は以下のようになっていると思います。
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: postgres
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./src:/app
- ./entrypoint.sh:/app/entrypoint.sh
depends_on:
- db
web:
image: nginx:latest
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
- ./src/static:/app/static
ports:
- "80:80"
depends_on:
- app
動作確認
ビルド、実行をしてみます。
docker compose build
docker compose up -d
エラーなく完了したら、コンテナの稼働状態を確認しましょう。
docker ps
以下のように3つのコンテナが稼働していることがわかるはずです。
ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ddfe3f9ea1b nginx:latest "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp project-web-1
81452e08bf59 project-app "./entrypoint.sh" 11 minutes ago Up 11 minutes project-app-1
9b674f5fdb88 postgres "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 5432/tcp project-db-1
私のようにWSLで動かしている場合は、localhost
にアクセスすると、Djangoのロケットが飛んでいるはずです。
おわりに
このままの設定はセキュリティ的、コードの保守的など様々な問題を抱えているのでそのままの使用にはご注意ください。Docker上Djangoアプリを立ち上げたことがない場合などの最初の1ステップとして参考になればよいなと思い作成しました。
次は、実践でも使えるような状態を付け足すことをこちらの成果物をベースに作れたらなと思います。