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
を定義する。
...略...
psycopg2-binary
プロジェクト直下にDockerfile
、docker-compose.yml
、docker.env
ファイルを作成する。
$ touch Dockerfile docker-compose.yml docker.env
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
を選定した。
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は今回便宜的に*
(制限なし)とするが、本番環境では適切に設定すること。
SECRET_KEY = 'XXXXXXXXXX'
ALLOWED_HOSTS = '*'
POSTGRES_DB='XXXXX'
POSTGRES_USER='XXXXX'
POSTGRES_PASSWORD='XXXXX'
3.Django設定ファイルを変更
config/settings.py
のSECRET_KEY
、ALLOWED_HOSTS
、DATABASES
を変更する。
DEBUGはTrueのままとしておくが、本番環境ではFalseにすること。DATABASESのHOST
はDockerfileで定義したコンテナ名とする。
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画面が表示される。
Discussion