Django REST framework + PostgreSQL を Docker 内に構築


0.動作環境

Apple M1
macOS Monterey(ver12.2)
Python 3.9.7
Django 4.0.3
DjangoRESTframework 3.13.1
psycopg2-binary 2.9.3
Docker 20.10.12
docker-compose 1.29.2

1.REST AIPの作成

REST APIアプリケーションを予め作成しておく。
Django REST frameworkでREST APIを5分で構築1.プロジェクトとアプリケーションの作成2.プロジェクト設定ファイルの修正3.アプリケーションファイルの作成・修正に沿って作成すればOK。

2.Dockerfileおよび関係ファイルを作成

requirements.txtに、PythonからPostgreSQLを操作するライブラリpsycopg2を定義する。

requirements.txt
...略...
psycopg2-binary

プロジェクト直下にDockerfiledocker-compose.ymldocker.envファイルを作成する。

$ touch Dockerfile docker-compose.yml docker.env

Dockerfileに以下の通り記述する。

Dockerfile
FROM python:3.10.1-buster
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
RUN pip install --upgrade pip
ADD requirements.txt /code/
RUN pip install -r requirements.txt

docker-compose.ymlに以下の通り記述する。今回、PostgreSQLイメージは公式より13-bullseyeを選定した。

docker-compose.yml
version: '3'
services:
  # PostgreSQL
  postgres_db:
    container_name: postgres_db
    image: postgres:13-bullseye
    env_file: ./docker.env
    volumes:
      - postgres_data:/var/lib/postgresql/data
 
  # Django REST framework
  backend:
    container_name: DRF
    env_file: ./docker.env
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - postgres_db

volumes:
  postgres_data:

docker.envに環境変数を定義する。
SECRET_KEYはDjangoプロジェクトで生成されたものを記述する。ALLOWED_HOSTSは今回便宜的に*(制限なし)とするが、本番環境では適切に設定すること。

docker.env
SECRET_KEY = 'XXXXXXXXXX'
ALLOWED_HOSTS = '*'
POSTGRES_DB='XXXXX'
POSTGRES_USER='XXXXX'
POSTGRES_PASSWORD='XXXXX'

3.Django設定ファイルを変更

config/settings.pySECRET_KEYALLOWED_HOSTSDATABASESを変更する。
DEBUGはTrueのままとしておくが、本番環境ではFalseにすること。DATABASESのHOSTはDockerfileで定義したコンテナ名とする。

config/settings.py
SECRET_KEY = os.environ.get('SECRET_KEY')
DEBUG = True
ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS')]
......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': 'postgres_db',
        'PORT': 5432,
    }
}
......

4.Dockerコンテナを作成・起動する

ここまで作業してファイル構成は以下の通りとなっている。

├── venv
├── apiv1
├── config
│   ├── settings.py
│   ...略...
├── apiv1
├── Dockerfile
├── docker-compose.yml
├── docker.env
├── manage.py
└── requirements.txt

docker-compose up -dコマンドでDockerファイルをビルド→起動する。

$ docker-compose up -d

DRFコンテナ内に入り、マイグレーションする。

$ docker exec -it DRF /bin/bash
root@XXX:/code# python manage.py makemigrations
root@XXX:/code# python manage.py migrate

Dockerコンテナ内で簡易サーバーは起動済みのため、http://localhost:8000/api/v1/を指定すればDjango REST framework画面が表示される。