Dockerを使ったことがない人でも気軽に挑戦できる公式チュートリアル「クイックスタート: ComposeとDjango」をやってみました!
この記事は、公式チュートリアルでの不明点や変更箇所を含めて解説しながら進めています。
Dockerを使ったDjangoアプリの構築方法を一緒に学びましょう。
クイックスタートの概要
Docker Composeを使ってDjangoアプリを構築するチュートリアルです。
この流れを学べば、DjangoとPostgreSQLを使ったWebアプリケーション開発環境を簡単に構築できるようになります。
Djangoって何?
Django(ジャンゴ)は、Pythonで作られたWebアプリケーションフレームワークです。
- 初心者に優しい: シンプルな構造でWebアプリを作りやすい。
- 便利な機能が充実: 管理画面や認証機能が最初から組み込まれている。
- スピーディーな開発: 短時間でWebアプリを作れる。
(例 Youtube、Dropbox、Instagram)
Djangoを使うと、ログイン機能やデータベース操作のような面倒な作業が簡単になります。
例えば、ブログやECサイトのようなWebサービスを作るのに適しています。
PostgreSQLって何?
PostgreSQL(ポストグレス)は、データを管理するためのデータベース管理システム(RDBMS)です。以下が特徴です。
- 信頼性が高い: 大量のデータを安全に管理できる。
- 高性能: 高速なデータ検索が可能。
- Djangoとの相性が良い: Djangoのデータ管理機能(ORM)と簡単に連携できる。
今回のチュートリアルでは、Djangoを使ったWebアプリのデータ(例:ユーザー情報やブログ投稿)をPostgreSQLで保存します。
クイックスタートに基づいてDjangoWebアプリを作成する
必要な準備
準備するもの
- Docker と Docker Compose がインストールされているPC。
作業の開始
作業ディレクトリの作成
プロジェクト用のディレクトリを作成し、その中に必要なファイルを配置します。
mkdir django-example
cd django-example
Dockerfileの作成
Djangoイメージを生成するファイルです。
(エラーが発生したため、Pythonのバージョンを 3.10 に変更しています。)
FROM python:3.10
RUN apt-get update && apt-get install -y gcc && apt-get clean
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /code/
requirements.txt
Djangoに必要なPythonパッケージを指定します。
(最新のDjangoバージョン(3.2以上、または4.x)を使用するように変更しています。)
Django>=3.2,<4.0
psycopg2-binary>=2.9
docker-compose.ymlの作成
DjangoとPostgreSQLの連携を設定するComposeファイルです。
(version:は非推奨なため削除してあります。)
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
Djangoプロジェクトを作成する
以下のコマンドを実行して、Djangoプロジェクトを作成します。
sudo docker-compose run web django-admin startproject composeexample .
なぜこのコマンドが必要?
sudo docker-compose run web django-admin startproject composeexample .
を実行すると、Djangoの基本ファイル(manage.py や settings.py)がカレントディレクトリに作成されます。
- エラーを防ぐ
sudo docker-compose upでは、manage.pyを実行しています。
このコマンドを事前に実行しないと、以下のようなエラーが発生します。
python: can’t open file ‘manage.py’: [Errno 2] No such file or directory - ボリューム同期を正しく機能させる
docker-compose.ymlでは、volumesでホストディレクトリ(ローカル環境)とコンテナディレクトリを同期しています。
しかし、ホスト側が空の場合、コンテナも空ディレクトリとして扱われてしまうため、Djangoプロジェクトの生成が必要です。
コマンド実行後のファイル構成
このコマンド実行後、カレントディレクトリに以下のようなDjangoプロジェクトの基本ファイルが作成されます。
composeexample/
├── manage.py
└── myproject/
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
Djangoプロジェクト作成後の権限修正
Djangoプロジェクトのディレクトリとファイルの権限を適切に設定します。
sudo chown -R $USER:$USER composeexample manage.py
データベース接続設定を変更
DjangoとPostgreSQLを接続するために、composeexample/settings.py を編集します。
composeexample/settings.pyを変更
デフォルトのデータベース設定を以下のように書き換えます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('POSTGRES_NAME'),
'USER': os.environ.get('POSTGRES_USER'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': 5432,
}
}
エラーを回避するため、composeexample/settings.pyファイルの先頭に以下の行を追加します。
import os
これにより、docker-compose.yml で指定した環境変数に基づいてPostgreSQLに接続できます。
コンテナを起動する
以下のコマンドを実行して、DjangoとPostgreSQLのコンテナを起動します。
sudo docker-compose up
起動後のコンテナ構成
以下は、コンテナ起動後のDjangoとPostgreSQLコンテナの関連図です。

構成の説明
web コンテナ
Djangoアプリケーションが動作するコンテナ。
ローカルPCのポート 8000 を介してブラウザからアクセスできます。
PostgreSQL(db コンテナ)にデータベース接続を行います。
db コンテナ
PostgreSQLデータベースが動作するコンテナ。
コンテナ内のポート 5432 でDjangoからの接続を受け付けます。
ローカルPCのブラウザ
ユーザーがDjangoアプリにアクセスするためのインターフェース。
URL http://localhost:8000 を通じてDjangoアプリケーションに接続します。
Djangoアプリの起動と確認
コンテナが正常に起動していることを確認し、ブラウザで以下のURLにアクセスします。
http://localhost:8000
Djangoの初期画面が表示されれば成功です。

トラブルシューティング
権限エラー
composeexample ディレクトリや manage.py の権限が正しく設定されていない場合、以下のエラーとなります。
composeexample/settings.pyの編集でPermissionErrorが発生
sudo chown -R $USER:$USER composeexample manage.py
環境変数を取得できない
Djangoの設定ファイル composeexample/settings.py のデータベース設定で os.environ.get() を使用していますが、os モジュールが定義されていないため、Pythonが NameError をスローする。
エラー箇所
composeexample/settings.pyファイル内
'NAME': os.environ.get('POSTGRES_NAME')
解決方法
composeexample/settings.py ファイル先頭に以下を追加import os
まとめ
チュートリアル通り進めると、エラーが発生する箇所もありましたが、作業する上でいろいろと勉強になります。
作業完了後は、Docker Composeを使うことで、ローカル環境にDjangoやPostgreSQLを直接インストールする手間もなくなり、簡単にDjangoを起動できるようになりました。

