クイックスタート・ガイド:Docker Compose と Django

このクイックスタート・ガイドは Docker Compose を使い、簡単な Django/PostgreSQL アプリをセットアップします。その前に、 Compose のインストール が必要です。

プロジェクトの構成物を定義

このプロジェクトでは、Dockerfile と、Python 依存関係のファイル、docker-compose.yml ファイルを作成する必要があります。

  1. プロジェクト用の空のディレクトリを作成。

覚えやすい名前のディレクトリを作成します。このディレクトリがアプリケーション・イメージの内容となるものです。ディレクトリには、イメージ構築に関するリソースのみ置きます。

  1. プロジェクト用のディレクトリに、Dockerfile という名称の新規ファイルを作成します。

Dockerfile はアプリケーションのイメージ内容に含まれる、1つまたは複数のイメージ構築用のコマンドを定義します。構築(ビルド)時に、コンテナの中でイメージを実行できます。Dockerfile の詳細情報については、 Docker ユーザ・ガイドDockerfile リファレンス をご覧ください。

  1. Dockerfile に次の内容を加えます。
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

この Dockerfile は Python 2.7 ベース・イメージを使って開始します。ベース・イメージに新しく /code ディレクトリ追加という変更が行われます。ベース・イメージは、requirements.txt ファイルで定義されている Python 依存関係のインストールという、更なる変更を定義するものです。

  1. Dockerfile を保存して閉じます。
  1. requirements.txt をプロジェクト用のディレクトリに作成します。

このファイルは DockerfileRUN pip install -r requirements.txt 命令で使います。

  1. ファイル中に必要なソフトウェアを記述します。
Django
psycopg2
  1. requirements.txt ファイルを保存して閉じます。
  1. プロジェクト用のディレクトリに docker-compose.yml という名称のファイルを作成します。

docker-compose.yml ファイルは、アプリケーションを作るためのサービスを記述します。この例におけるサービスとはウェブサーバとデータベースです。また、Compose ファイルではサービスが利用する Docker イメージ、どのように相互にリンクするか、コンテナ内で必要となるボリュームをそれぞれ定義します。最後に docker-compose.yml ファイルでサービスを公開するポートを指定します。詳細な情報や動作に関しては docker-compose.yml リファレンス をご覧ください。

  1. ファイルに以下の設定を追加します。
version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

このファイルは2つのサービスを定義しています。db サービスと web サービスです。

  1. docker-compose.yml ファイルを保存して閉じます。

Django プロジェクトの作成

このステップでは、Django を開始するプロジェクトを作りましょう。そのためには、先の手順で構築内容を定義したイメージを作成します。

  1. プロジェクト用のディレクトリに移動します。
  1. Django プロジェクトを docker-compose コマンドを使って作成します。
$ docker-compose run web django-admin.py startproject composeexample .

これは Compose に対して、コンテナ内で django-admin.py startproject composeexample を実行するよう命令します。コンテナは web サービスのイメージと設定を使います。web イメージはまだ作成していませんが、docker-compose.ymlbuild: . 行の命令があるため、現在のディレクトリ上で構築します。

web サービスのイメージが構築されると、Compose はこのイメージを使い、コンテナの中で django-admin.py startproject を実行します。このコマンドは Django プロジェクトの代表として、Django に対してファイルとディレクトリの作成を命令します。

  1. docker-compose コマンドが完了すると、プロジェクトの内容は次のようになります。
$ ls -l
drwxr-xr-x 2 root   root   composeexample
-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

ファイル django-admin は所有者が root として作成されました。これはコンテナが root ユーザによって実行されたからです。

Docker を Linux 上で動かしている場合は、 django-admin は root の所有者として作成されます。つまり、これはコンテナが root ユーザとして実行されるのを意味します。新しいファイルの所有者を変更するには、次のように実行します。

sudo chown -R $USER:$USER .

Docker を Mac あるいは 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 向けのデータベースをセットアップします。

  1. プロジェクト用ディレクトリで、composeexample/settings.py ファイルを編集します。
  1. DATABASES = ... を以下のものに置き換えます。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

これらの設定は docker-compose.yml で指定した postgres Docker イメージによって決められているものです。

  1. ファイルを保存して閉じます。
  1. docker-compose up コマンドを実行します。
$ docker-compose up
Starting composepractice_db_1...
Starting composepractice_web_1...
Attaching to composepractice_db_1, composepractice_web_1
...
db_1  | PostgreSQL init process complete; ready for start up.
...
db_1  | LOG:  database system is ready to accept connections
db_1  | LOG:  autovacuum launcher started
..
web_1 | Django version 1.8.4, 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 Machine の仮想マシンを使っている場合は、docker-machine ip マシン名 を実行して IP アドレスを取得できます。