クイックスタート・ガイド:Docker Compose と Django¶
このクイックスタート・ガイドは Docker Compose を使い、簡単な Django/PostgreSQL アプリをセットアップします。事前に Compose のインストール が必要です。
プロジェクトの構成物を定義¶
このプロジェクトでは、Dockerfile と、Python 依存関係のファイル、docker-compose.yml
ファイルを作成する必要があります。
- プロジェクト用の空のディレクトリを作成します。
覚えやすい名前のディレクトリを作成します。このディレクトリがアプリケーション・イメージの内容(コンテクスト)となるものです。ディレクトリには、イメージ構築に関するリソースのみ置くべきです。
- プロジェクト用のディレクトリに、
Dockerfile
という名称の新規ファイルを作成します。
Dockerfile はアプリケーションのイメージ内容に含まれる、1つまたは複数のイメージ構築用のコマンドを定義します。構築(ビルド)時に、コンテナの中でイメージを実行できます。Dockerfile
の詳細情報については、 Docker ユーザ・ガイド や Dockerfile リファレンス をご覧ください。
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 依存関係のインストールという、更なる変更を定義します。
Dockerfile
を保存して閉じます。
requirements.txt
をプロジェクト用のディレクトリに作成します。
このファイルは Dockerfile
の RUN pip install -r requirements.txt
命令で使います。
- ファイル中に必要なソフトウェアを記述します。
Django
psycopg2
requirements.txt
ファイルを保存して閉じます。
- プロジェクト用のディレクトリに
docker-compose.yml
という名称のファイルを作成します。
docker-compose.yml
ファイルは、アプリケーションを作るためのサービスを記述します。この例におけるサービスとはウェブサーバとデータベースです。また、Compose ファイルではサービスが利用する Docker イメージ、どのように相互にリンクするか、コンテナ内で必要となるボリュームをそれぞれ定義します。最後に docker-compose.yml
ファイルでサービスを公開するポートを指定します。詳細な情報や動作に関しては docker-compose.yml リファレンス をご覧ください。
- ファイルに以下の設定を追加します。
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
サービスです。
docker-compose.yml
ファイルを保存して閉じます。
Django プロジェクトの作成¶
このステップでは、Django を開始するプロジェクトを作りましょう。そのためには、先の手順で構築内容を定義したイメージを作成します。
- プロジェクト用のディレクトリに移動します。
- Django プロジェクトを
docker-compose
コマンドを使って作成します。
$ docker-compose run web django-admin.py startproject composeexample .
これは Compose に対して、コンテナ内で django-admin.py startproject composeexample
を実行するよう命令します。コンテナは web
サービスのイメージと設定を使います。web
イメージはまだ作成していませんが、docker-compose.yml
の build: .
行の命令があるため、現在のディレクトリ上で構築します。
web
サービスのイメージを構築したら、Compose はこのイメージを使い、コンテナ内で django-admin.py startproject
を実行します。このコマンドは Django プロジェクトの代表として、Django に対してファイルとディレクトリの作成を命令します。
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 用のデータベースをセットアップします。
- プロジェクト用ディレクトリで、
composeexample/settings.py
ファイルを編集します。
DATABASES = ...
を以下のものに置き換えます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
これらの設定は docker-compose.yml
で指定した postgres Docker イメージによって決められているものです。
- ファイルを保存して閉じます。
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 アドレスを取得できます。