0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

最小限の設定でNginx, gunicorn, Django, Postgresql環境をDocker上に構築する

Last updated at Posted at 2025-09-06

はじめに

本記事は最低限の設定でDocker上にNginx, Django, Postgesql環境を構築するガイドです。
ここでいう最低限の設定とはport番号、ユーザー名などデフォルトで設定されているものはデフォルトのものをそのまま利用し、一般的に柔軟性を持たせるために作成する環境変数などもハードコーディング等で済ませてしまいます。
そのためここで構築する環境は開発環境、運用環境、どちらにも適しませんが、Dockerのベースを抑えるための学習目的、あるいはカスタムのベースにするためのものです。

今回の環境

Windows機で試していますが、DockerはWSL上のUbuntu-24.04にインストールしたものを使います。
企業の場合は、WindowsのDockerは有償なので。

Djangoプロジェクトの立ち上げ

必要なライブラリを記載するためにrequirements.txtをルートのフォルダに作ります。

requirements.txt
Django
gunicorn
psycopg2-binary

ソースコードを保管するディレクトリを作成します。

mkdir src

Djangoのみインストールし、Djangoのプロジェクトを立ち上げます。

pip install django
django-admin startproject setting ./src

./src/setting/settings.pyDATABASEALLOWED_HOSTSSTATIC_ROOTを以下のように書き換えます。

settings.py
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の設定

以下の内容を追加します。

docker-compose.yml
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: postgres

ポイント

  • ユーザ名を指定しない場合、自動的にpostgresになります
  • データベース名を指定しない場合、自動的にpostgresになります

djangoの設定

以下の内容を追加します。

docker-compose.yml
  app:
    build: 
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./src:/app
      - ./entrypoint.sh:/app/entrypoint.sh
    depends_on:
      - db

Dockerfileをルートフォルダの中に作ります。

Dockerfile
FROM python

WORKDIR /app

COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

ENTRYPOINT ["./entrypoint.sh"]

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の設定

以下の内容を追加します。

docker-compose.yml
  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をルートフォルダの中に作ります。

default.conf
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の内容は以下のようになっていると思います。

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ステップとして参考になればよいなと思い作成しました。
次は、実践でも使えるような状態を付け足すことをこちらの成果物をベースに作れたらなと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?