アプリケーション開発で、必ず行う作業がローカル開発環境の初期設定。
最初の数日しか時間をかけないので、いつも手順を忘れちゃいます。笑
今回はその中でも、DockerでDjango+PostgreSQLの初期設定ができるようにします。
環境情報
種類 | バージョン |
---|---|
OS | Mac(Monterey 12.3.1) |
Python | 3.9.10 |
Docker Desktop | 3.5.2 |
Docker Compose | 1.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_NAME | Dockerイメージ、コンテナ名の先頭に表示する文字 (省略した場合はディレクトリ名を表示) |
POSTGRES_DB | 自動的に作成するデータベースの名前 |
POSTGRES_USER | 自動的に作成するスーパーユーザーの名前 |
POSTGRES_PASSWORD | スーパーユーザーのパスワード |
DB_HOST | Docker内から接続するデータベースのホスト名 (Docker内通信はデータベースのコンテナ名でOK) |
DB_PORT | Docker内からデータベース接続に使用するポート番号 |
DB_EXPOSE_PORT | Docker外からデータベース接続に使用するポート番号 (PC内に複数のPostgreSQLがあれば、重複しないポート番号を指定すること) |
DB_ENGINE | Djangoで使用するデータベースの種類 |
DB_NAME | Djangoから接続するデータベースの名前 |
DB_USER | データベース接続に使用するユーザーの名前 |
DB_PASSWORD | データベース接続に使用するユーザーのパスワード |
APP_PORT | Docker内からDjango接続に使用するポート番号 |
APP_EXPOSE_PORT | Docker外から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で効率のよい人生を!
ではまた。