DockerでDjango+PostgreSQLの開発環境を構築

アプリケーション開発で、必ず行う作業がローカル開発環境の初期設定。
最初の数日しか時間をかけないので、いつも手順を忘れちゃいます。笑

今回はその中でも、DockerでDjango+PostgreSQLの初期設定ができるようにします。

目次

環境情報

種類バージョン
OSMac(Monterey 12.3.1)
Python3.9.10
Docker Desktop3.5.2
Docker Compose1.29.2

Docker環境の構築

ターミナル(コマンドプロンプト)を起動しよう

Dockerの構築ではターミナル(コマンドプロンプト)を使用します。
以下のような画面です。

ターミナル起動時の画面
ターミナル起動時の画面

「ターミナルとは?コマンドプロンプトとは?」という方は、以下の書籍で “ターミナルの開き方、基本操作” + “Dockerの基本概念から操作” が学べます。
本書籍は、画像が多めに使われていて、初学者にオススメです。

\\ 初学者にオススメ //

  • “Chapter3 Dockerを使ってみよう > Section03 Dockerの操作方法とコマンドプロンプト/ターミナルの起動” を参照ください。

プロジェクトのディレクトリを作成しよう

まずは自分自身のPCに、今回のプロジェクトを格納するディレクトリを用意しましょう。

ターミナル(コマンドプロンプト)で以下のコマンドを実行しましょう。
ディレクトリの作成場所に指定はありません。好きな場所に作成してOK!

mkdir -p ~/projects/docker-django-postgresql-sample
cd ~/projects/docker-django-postgresql-sample
  • 本記事では、上記のようなコマンドブロックを多数用意しました。
  • 右上に “Bash” と書かれているのは、ターミナル(コマンドプロンプト)で実行するコマンドを指します。
  • “Bash” ではなく、”ファイル名” が記載されている場合は、ファイルの編集を指します。
  • クリップボードアイコンを押すと、テキストコピーできます。活用してください。

Django用のDockerファイルを作成しよう

Dockerファイル格納用のディレクトリを作成します。

Django用のDockerコンテナ名は”app”と定義しておきます。
もちろん、自分自身の管理しやすい名称に変更してもOK!

mkdir -p docker/app
touch docker/app/Dockerfile

次にappコンテナ用のDockerfileを作成します。

FROM python:3.9-slim

# コンソールのバッファを無効にする
ENV PYTHONUNBUFFERED 1

# 必要なライブラリをインストール
RUN apt-get update && apt-get install -y \
    cron \
    busybox-static \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

RUN pip install --upgrade pip

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

RUN mkdir /app
WORKDIR /app
COPY ./src src
COPY ./scripts scripts

PostgreSQL用のDockerファイルを作成しよう

PostgreSQL用のDockerコンテナ名は”db”と定義します。

日本語を取り扱う可能性がある場合は、日本語ロケールのセットアップをDockerfileで定義しましょう。
(日本語の文字列並び替え等が意図した通りになります)

mkdir -p docker/db
touch docker/db/Dockerfile
FROM postgres:13.4

# 日本語
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.utf8
ENV LANG ja_JP.utf8

Dockerコンテナに定義する環境変数ファイルを作成しよう

データベースの接続情報など、環境で変化するもの、またセキュアな情報は環境変数の利用を推奨します。

特に、PostgreSQLのDockerコンテナは、環境変数の利用で以下メリットがあります。
ぜひ活用しましょう。

  • デフォルトで作成されるデータベースの名前を任意の名前に設定可能
  • デフォルトで作成されるスーパーユーザーのユーザー名、パスワードを設定可能

今回は以下の環境変数を用意しました。内容にも触れておきますね。

環境変数名説明
COMPOSE_PROJECT_NAMEDockerイメージ、コンテナ名の先頭に表示する文字
(省略した場合はディレクトリ名を表示)
POSTGRES_DB自動的に作成するデータベースの名前
POSTGRES_USER自動的に作成するスーパーユーザーの名前
POSTGRES_PASSWORDスーパーユーザーのパスワード
DB_HOSTDocker内から接続するデータベースのホスト名
(Docker内通信はデータベースのコンテナ名でOK)
DB_PORTDocker内からデータベース接続に使用するポート番号
DB_EXPOSE_PORTDocker外からデータベース接続に使用するポート番号
(PC内に複数のPostgreSQLがあれば、重複しないポート番号を指定すること)
DB_ENGINEDjangoで使用するデータベースの種類
DB_NAMEDjangoから接続するデータベースの名前
DB_USERデータベース接続に使用するユーザーの名前
DB_PASSWORDデータベース接続に使用するユーザーのパスワード
APP_PORTDocker内からDjango接続に使用するポート番号
APP_EXPOSE_PORTDocker外からDjango接続に使用するポート番号
環境変数一覧

以下のコマンドで環境変数を管理するファイルを作成します。

touch .env

作成した.envファイルを編集します。
好きな値に変更してもOK!

# docker -------------------
COMPOSE_PROJECT_NAME=ddp-sample

# db -------------------
POSTGRES_DB=sampledb
POSTGRES_USER=sampleuser
POSTGRES_PASSWORD=samplepassword
DB_HOST=db
DB_PORT=5432
DB_EXPOSE_PORT=54321

# app -------------------
DB_ENGINE=django.db.backends.postgresql
DB_NAME=${POSTGRES_DB}
DB_USER=${POSTGRES_USER}
DB_PASSWORD=${POSTGRES_PASSWORD}
APP_PORT=5000
APP_EXPOSE_PORT=50000

docker-composeファイルを作成しよう

複数のコンテナを扱う場合、Docker Composeを利用すると便利です。

  • 複数のコンテナを一気に実行・停止・破棄できる
  • Dockerコンテナ間通信も簡単に設定できる
  • データベースのデータ永続化(Volumeの使用)も簡単に設定できる

Docker Composeの利用には、Dockerとは別のソフトウェアをダウンロードする必要があります。
「Docker Composeとは?」という方は、以下の書籍で “インストールと使い方”について学べます。

\\ Docker Composeを図でわかりやすく説明 //

  • “Chapter7 Docker Composeについて学ぼう > Section02 Docker Composeのインストールと使い方” を参照ください。

Docker Composeをインストールした方は、以下のコマンドでdocker-composeファイルを作成しましょう。

touch docker-compose.yml

作成したdocker-composeファイルを編集します。

version: "3.8"

services:
  db:
    env_file: .env
    build:
      context: .
      dockerfile: docker/db/Dockerfile
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - "${DB_EXPOSE_PORT:-54320}:${DB_PORT:-5432}"

  app:
    env_file: .env
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    command: python src/manage.py runserver 0.0.0.0:"${APP_PORT:-5000}"
    volumes:
      - .:/app
    ports:
      - "${APP_EXPOSE_PORT:-50000}:${APP_PORT:-5000}"
    depends_on:
      - db

volumes:
  db-data:
    driver: local

Django環境の構築

Djangoのアプリケーションを作成しましょう。

Djangoでは、ゼロからソースコードを用意していくわけではありません。
ソースコードを自動的に作成するコマンドが用意されています。

Dockerイメージ、コンテナを用意する前に、ソースコードを編集するための仮想環境を用意しましょう。

仮想環境を用意しよう

以下のコマンドで仮想環境を作成します。

python3 -m venv venv

続いて、以下のコマンドで仮想環境を有効化します。
ターミナルのコマンド入力行の先頭に “(venv)” と表示されればOKです!

source venv/bin/activate

有効化すると、最初はPythonのライブラリが全くインストールされていない状態になります。
試しに、以下のコマンドを実行してください。

pip freeze

何もインストールされてない、つまり何も出力されなければOKです!

Djangoのプロジェクトを用意しよう

インストールするPythonライブラリをrequirementsファイルにまとめます。

mkdir -p requirements
touch requirements/base.txt

作成したファイルにインストールするライブラリを追加しましょう。
今回はDjangoと、PostgreSQL接続用のライブラリを追加します。

Django==4.0.3
psycopg2-binary==2.9.3

ファイルを編集したら、以下のコマンドでライブラリをインストールしましょう。

pip install -r requirements/base.txt 

以下のコマンドでインストールに成功したか確認しましょう。
“Django==4.0.3″が表示されればOK!

pip freeze

Djangoがインストールできたら、以下のコマンドで設定ファイルを作成します。

mkdir src
django-admin startproject config ./src

以下のコマンドで設定ファイルが作成できたか確認しましょう。
“settings.py”などが存在すればOK!

ls src/config

Djangoのデータベース接続設定を変更しよう

設定ファイルにPostgreSQLデータベースへの接続設定を追加しましょう。

まずは、環境変数を読み込むための準備です。
settings.pyに以下のimportを追加しましょう。

import os  # 追加
from pathlib import Path

次にデータベースの設定です。
デフォルトではSQLiteを使用する設定になっています。
settings.pyのDATABASESの値を環境変数から取得するように変更しましょう。

DATABASES = {
    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE': os.getenv('DB_ENGINE'),
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': os.getenv('DB_PORT'),
    },
}

Djangoの初期設定はこれで終わりです。

Docker環境を起動

DjangoとPostgreSQLの初期設定が終わったので、Docker環境にコンテナを起動してみましょう。

Dockerコンテナを起動しよう

以下のコマンドでDockerイメージを作成・Dockerコンテナを起動しましょう。

docker-compose up --build -d

正常にDockerイメージが作成されたか確認しましょう。
以下のコマンドで”ddp-sample_app”、”ddp-sample_db”が表示されればOK!

docker images

正常にDockerコンテナが作成されたか確認しましょう。
以下のコマンドで”ddp-sample_app”、”ddp-sample_db”のSTATUSが”Up”から始まっていればOK!

docker ps -a

もし、STATUSが”Exited”から始まっていれば、ログを確認しましょう。
以下のコマンドでDockerコンテナのログを確認することができます。

docker-compose logs app

これでDocker環境の構築は完了です。

Django管理画面ログイン用のユーザを作成しよう

DjangoがPostgreSQLに接続できているか確認していきましょう。

以下のコマンドで、Djangoが使用するテーブルをデータベースに作成します。

docker-compose exec app python src/manage.py migrate

次に、Django管理画面のログイン用アカウントを作成しましょう。
以下のコマンドを実行すると、ユーザー名とパスワードを求められます。

docker-compose exec app python src/manage.py createsuperuser

Django管理画面にログインしよう

先ほど作成したアカウントでログインしてみましょう。
以下のURLをブラウザで開いて、ユーザ名とパスワードを入力してください。
ログインが成功すればOK!

http://localhost:50000/admin

PostgreSQLにアカウントが登録されているか確認しよう

今度は直接PostgreSQLに接続して、SQLを実行してみましょう。
以下のコマンドを実行し、PostgreSQLに接続します。

docker-compose exec app python src/manage.py dbshell

作成されたアカウントが存在するか確認しましょう。
入力したユーザ名のデータが存在すればOK!

SELECT * FROM auth_user;  // 登録アカウントを確認
\q

以上でDjangoとPostgreSQLのDocker環境構築は完了です。
お疲れ様でした。

さいごに

いかがでしたでしょうか?
Dockerを使えば、PostgreSQLの環境構築も、Djangoへの接続も簡単にできますよね。

また手順を忘れたら、戻ってきてください。

今回作成したDocker環境が不要になった方は、以下のコマンドで削除しておきましょう。
関連する情報を一括で削除します。

docker-compose down --rmi all --volumes --remove-orphans

それでは、Djangoで効率のよい人生を!
ではまた。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次
閉じる