クィックスタート: Compose と Django
読む時間の目安: 5 分
このクィックスタートガイドでは Docker Compose を使って、簡単な Django/PostgreSQL アプリを設定し実行する手順を示します。 はじめるには Compose のインストール が必要です。
プロジェクトのコンポーネントを定義
このプロジェクトでは Dockerfile、Python の依存関係を示すファイル、docker-compose.yml
ファイルをそれぞれ生成します。(docker-compose.yml
の拡張子は.yml
と.yaml
のどちらでも構いません。)
-
空のプロジェクトディレクトリを生成します。
ディレクトリ名は覚えやすいものにします。 このディレクトリはアプリケーションイメージのコンテキストディレクトリとなります。 このディレクトリには、イメージをビルドするために必要となるものだけを含めるようにします。
-
プロジェクトディレクトリ内に
Dockerfile
というファイルを新規生成します。Dockerfile はアプリケーションイメージの内容を定義するものであり、イメージを設定しビルドするコマンドがいくつか記述されます。 ビルドが成功すると、コンテナー内にてイメージが起動します。
Dockerfile
の詳細は Docker ユーザーガイドや Dockerfile リファレンス を参照してください。 -
Dockerfile
に以下の内容を記述します。# syntax=docker/dockerfile:1 FROM python:3 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/
この
Dockerfile
はまず Python 3 の親イメージから始まっています。 この親イメージには新規のディレクトリcode
が加えられます。 さらにrequirements.txt
ファイルに定義された Python 依存パッケージをインストールする変更が加えられています。 -
Dockerfile
を保存して閉じます。 -
プロジェクトディレクトリに
requirements.txt
というファイルを生成します。このファイルは
Dockerfile
内のRUN pip install -r requirements.txt
というコマンドにおいて利用されます。 -
上のファイルに必要となるソフトウェアを記述します。
Django>=3.0,<4.0 psycopg2>=2.8
-
requirements.txt
ファイルを保存して閉じます。 -
プロジェクトディレクトリ内に
docker-compose.yml
というファイルを生成します。docker-compose.yml
ファイルは、アプリケーションを作り出すサービスを記述するものです。 この例においてそのサービスとは、ウェブサーバーとデータベースです。 Compose ファイルはまた、各サービスが利用する Docker イメージを記述します。 そしてどのように互いにリンクし合い、コンテナー内部にマウントすべきボリュームはどのようなものかを定義します。 そしてdocker-compose.yml
ファイルには、各サービスが公開するポート番号が何かも記述します。 このファイルがどのようにして動作するかの詳細はdocker-compose.yml
リファレンスを参照してください。 -
以下の設定内容をファイルに記述します。
version: "3.9" 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
このファイルには
db
サービスとweb
サービスという 2 つのサービスが定義されています。メモ
これは開発環境においてビルドを行い、アプリケーションをポート 8000 で動作させるものです。 これを本番環境で利用しないでください。 詳しくは Django ドキュメント を参照してください。
-
docker-compose.yml
ファイルを保存して閉じます。
Django プロジェクトの生成
ここでの手順では、前の手順で定義したビルドコンテキストからイメージをビルドし、Django プロジェクトのひながたを生成します。
-
プロジェクトディレクトリに移動します。
-
Django プロジェクトを生成するために docker-compose run コマンドを以下のように実行します。
$ sudo docker-compose run web django-admin startproject composeexample .
このコマンドは Compose に対し、コンテナー内において
django-admin startproject composeexample
を実行するものです。 その際にはweb
サービスイメージとその設定を利用します。 ただしweb
イメージはこの時点ではまだ存在していないため、Compose はカレントディレクトリからそのイメージをビルドします。このことはdocker-compose.yml
のbuild: .
という記述行において指示されています。web
サービスイメージがビルドされると Compose はこのイメージを起動し、コンテナー内でコマンドdjango-admin startproject
を実行します。 このコマンドは Django に対して、Django プロジェクトを組み立てるファイルやディレクトリを生成することを指示するものです。 -
docker-compose
コマンドの処理が完了したら、プロジェクト内の一覧を表示してみます。$ ls -l drwxr-xr-x 2 root root composeexample drwxr-xr-x 3 root root data -rw-rw-r-- 1 user user docker-compose.yml -rw-rw-r-- 1 user user Dockerfile -rwxr-xr-x 1 root root manage.py -rw-rw-r-- 1 user user requirements.txt
Linux 上で Docker を利用している場合、
django-admin
が生成したファイルの所有者が root になっています。 これはコンテナーが root ユーザーで実行されるからです。 生成されたファイルの所有者を以下のようにして変更します。Postgres の関連ファイルがあるデータフォルダーに対して、そのパーミッションは変更しないでください。 これを行ってしまうと、パーミッションが原因で Postgres が起動できなくなります。
$ sudo chown -R $USER:$USER composeexample manage.py
Docker on Mac あるいは Docker on Windows を利用している場合は、生成されたファイルの所有権は、
django-admin
が作り出したファイルも含めて、すべて持っています。 確認のため一覧を表示してみます。$ ls -l total 32 -rw-r--r-- 1 user staff 145 Feb 13 23:00 Dockerfile drwxr-xr-x 6 user staff 204 Feb 13 23:07 composeexample -rw-r--r-- 1 user staff 159 Feb 13 23:02 docker-compose.yml -rwxr-xr-x 1 user staff 257 Feb 13 23:07 manage.py -rw-r--r-- 1 user staff 16 Feb 13 23:01 requirements.txt
データベースへの接続設定
ここでは Django におけるデータベース接続の設定を行います。
-
プロジェクトディレクトリにおいて
composeexample/settings.py
ファイルを編集します。 -
DATABASES = ...
の部分を以下のように書き換えます。# settings.py import os [...] 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, } }
上の設定は
docker-compose.yml
に指定した Docker イメージ postgres が定めている内容です。 -
ファイルを保存して閉じます。
-
プロジェクトのトップディレクトリにおいてコマンド docker-compose up を実行します。
$ docker-compose up djangosample_db_1 is up-to-date Creating djangosample_web_1 ... Creating djangosample_web_1 ... done Attaching to djangosample_db_1, djangosample_web_1 db_1 | The files belonging to this database system will be owned by user "postgres". db_1 | This user must also own the server process. db_1 | db_1 | The database cluster will be initialized with locale "en_US.utf8". db_1 | The default database encoding has accordingly been set to "UTF8". db_1 | The default text search configuration will be set to "english". <...> web_1 | July 30, 2020 - 18:35:38 web_1 | Django version 3.0.8, using settings 'composeexample.settings' web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.
この段階で Django アプリは Docker ホスト上のポート
8000
で稼動しています。 Docker Desktop for Mac または Docker Desktop for Windows の場合は、ブラウザーからhttp://localhost:8000
にアクセスすることで、Django の Welcome ページを確認できます。メモ:
特定プラットフォーム(Windows 10)では、
settings.py
ファイル内のALLOWED_HOSTS
に、ホスト名あるいはホストの IP アドレスを追加することが必要かもしれません。 ここはデモが目的なので、以下のように設定することにします。ALLOWED_HOSTS = ['*']
この設定は本番環境では安全ではありません。 詳しくは Django ドキュメント を参照してください。
-
起動しているコンテナーの一覧を確認します。
別の端末画面を開いて
docker ps
またはdocker container ls
コマンドを実行し、起動している Docker プロセスの一覧を表示します。$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES def85eff5f51 django_web "python3 manage.py..." 10 minutes ago Up 9 minutes 0.0.0.0:8000->8000/tcp django_web_1 678ce61c79cc postgres "docker-entrypoint..." 20 minutes ago Up 9 minutes 5432/tcp django_db_1
-
サービスを停止しクリアするために、以下のいずれかの方法をとります。
-
アプリケーションを実行したシェル上で
Ctrl-C
を入力してアプリケーションを止めます。Gracefully stopping... (press Ctrl+C again to force) Killing test_web_1 ... done Killing test_db_1 ... done
-
もう少しきれいなやり方として別のシェル画面に切り替えて、Django サンプルプロジェクトのトップディレクトリにおいて docker-compose down を実行します。
$ docker-compose down Stopping django_web_1 ... done Stopping django_db_1 ... done Removing django_web_1 ... done Removing django_web_run_1 ... done Removing django_db_1 ... done Removing network django_default
-
アプリを停止したら Django プロジェクトディレクトリは何も問題なく削除することができます。
(たとえば rm -rf django
)
その他の Compose ドキュメント
- Docker Compose 概要
- Docker Compose のインストール
- Docker Compose をはじめよう
- Docker Compose コマンドラインリファレンス
- Compose ファイルリファレンス
- Awesome Compose サンプル