クィックスタート: Compose と Django¶
このクィックスタート・ガイドでは Docker Compose を使って、簡単な Django/PostgreSQL アプリを設定し実行する手順を示します。 はじめる前に Compose をインストール してください。
プロジェクトのコンポーネントを定義¶
このプロジェクトでは Dockerfile、Python の依存パッケージを示すファイル、 docker-compose.yml
ファイルをそれぞれ生成します。( docker-compose.yml
の拡張子は .yml
と .yaml
のどちらでも構いません。)
プロジェクト用の空のディレクトリを作成します。
ディレクトリ名は覚えやすいものにします。 このディレクトリはアプリケーションイメージのコンテキストディレクトリとなります。 このディレクトリには、イメージをビルドするために必要となるものだけを含めるようにします。
プロジェクトディレクトリ内に
Dockerfile
というファイルを新規生成します。Dockerfile はアプリケーション・イメージの内容を定義するものであり、イメージを設定しビルドするコマンドがいくつか記述されます。 ビルドが成功すると、コンテナ内にてイメージが起動します。
Dockerfile
の詳細は Docker ユーザ・ガイド や Dockerfile リファレンス を参照してください。
Dockerfile
に次の内容を加えます。FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/
この
Dockerfile
はまず Python 3 の親イメージ から始まっています。 この親イメージには新規のディレクトリcode
が加えられます。 さらにrequirements.txt
ファイルに定義された Python 依存パッケージをインストールする変更が加えられています。
Dockerfile
を保存して閉じます。
プロジェクト・ディレクトリに
requirements.txt
というファイルを生成します。このファイルは
Dockerfile
内のRUN pip install -r requirements.txt
というコマンドにおいて利用されます。
ファイル中に必要なソフトウェアを記述します。
Django>=1.8,<2.0 psycopg2
requirements.txt
ファイルを保存して閉じます。
プロジェクト・ディレクトリ内に
docker-compose.yml
というファイルを生成します。docker-compose.yml
ファイルは、アプリケーションを作り出すサービスを記述するものです。 この例においてそのサービスとは、ウェブ・サーバーとデータベースです。 Compose ファイルはまた、各サービスが利用する Docker イメージを記述します。 そしてどのように互いにリンクし合い、コンテナ内部にマウントすべきボリュームはどのようなものかを定義します。 そしてdocker-compose.yml
ファイルには、各サービスが公開するポート番号が何かも記述します。 このファイルがどのようにして動作するかの詳細は docker-compose.yml リファレンス を参照してください。
ファイルに以下の設定を追加します。
version: '3' services: db: image: postgres web: build: . command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db
このファイルには
db
サービスとweb
サービスという 2 つのサービスが定義されています。
docker-compose.yml
ファイルを保存して閉じます。
Django プロジェクトの生成¶
ここでの手順では、前の手順で定義したビルドコンテキストからイメージをビルドし、Django プロジェクトのひながたを生成します。
プロジェクト・ディレクトリに移動します。
Django プロジェクトを生成するために docker-compose run コマンドを以下のように実行します。
docker-compose run web django-admin.py 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 -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 ユーザで実行されるからです。 生成されたファイルの所有者を以下のようにして変更します。sudo chown -R $USER:$USER .
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 = ...
の部分を以下のように書き換えます。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', '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 | May 30, 2017 - 21:44:49 web_1 | Django version 1.11.1, 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 ページを確認できます。 Docker Machine を利用している場合はdocker-machine ip MACHINE_VM
を実行すると Docker ホストの IP アドレスが得られるので、ポート番号をつけてアクセスします(<DockerホストID>:8000
)。注釈
特定プラットフォーム(Windows 10)では、
settings.py
ファイル内のALLOWED_HOSTS
に、ホスト名あるいはホストの IP アドレスを追加することが必要かもしれません。 ここはデモが目的なので、以下のように設定することにします。ALLOWED_HOSTS = ['*']
この設定は本番環境では 安全ではありません 。 詳しくは Django ドキュメント を参照してください。
起動しているコンテナの一覧を確認します。
別の端末画面を開いて
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 を実行します。
vmb at mymachine in ~/sandbox/django $ 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
)