クィックスタート: 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 )