クィックスタート: Compose と Django

このクィックスタート・ガイドでは Docker Compose を使って、簡単な Django/PostgreSQL アプリを設定し実行する手順を示します。 はじめる前に Compose をインストール してください。

プロジェクトのコンポーネントを定義

このプロジェクトでは Dockerfile、Python の依存パッケージを示すファイル、 docker-compose.yml ファイルをそれぞれ生成します。( docker-compose.yml の拡張子は .yml.yaml のどちらでも構いません。)

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

    ディレクトリ名は覚えやすいものにします。 このディレクトリはアプリケーションイメージのコンテキストディレクトリとなります。 このディレクトリには、イメージをビルドするために必要となるものだけを含めるようにします。

  1. プロジェクトディレクトリ内に Dockerfile というファイルを新規生成します。

    Dockerfile はアプリケーション・イメージの内容を定義するものであり、イメージを設定しビルドするコマンドがいくつか記述されます。 ビルドが成功すると、コンテナ内にてイメージが起動します。 Dockerfile の詳細は Docker ユーザ・ガイドDockerfile リファレンス を参照してください。

  1. 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 依存パッケージをインストールする変更が加えられています。

  1. Dockerfile を保存して閉じます。
  1. プロジェクト・ディレクトリに requirements.txt というファイルを生成します。

    このファイルは Dockerfile 内の RUN pip install -r requirements.txt というコマンドにおいて利用されます。

  1. ファイル中に必要なソフトウェアを記述します。

    Django>=1.8,<2.0
    psycopg2
    
  1. requirements.txt ファイルを保存して閉じます。
  1. プロジェクト・ディレクトリ内に docker-compose.yml というファイルを生成します。

    docker-compose.yml ファイルは、アプリケーションを作り出すサービスを記述するものです。 この例においてそのサービスとは、ウェブ・サーバーとデータベースです。 Compose ファイルはまた、各サービスが利用する Docker イメージを記述します。 そしてどのように互いにリンクし合い、コンテナ内部にマウントすべきボリュームはどのようなものかを定義します。 そして docker-compose.yml ファイルには、各サービスが公開するポート番号が何かも記述します。 このファイルがどのようにして動作するかの詳細は docker-compose.yml リファレンス を参照してください。

  1. ファイルに以下の設定を追加します。

    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 つのサービスが定義されています。

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

Django プロジェクトの生成

ここでの手順では、前の手順で定義したビルドコンテキストからイメージをビルドし、Django プロジェクトのひながたを生成します。

  1. プロジェクト・ディレクトリに移動します。
  1. Django プロジェクトを生成するために docker-compose run コマンドを以下のように実行します。

    docker-compose run web django-admin.py startproject composeexample .
    

    このコマンドは Compose に対し、コンテナ内において django-admin startproject composeexample を実行するものです。 その際には web サービスイメージとその設定を利用します。 ただし web イメージはこの時点ではまだ存在していないため、Compose はカレントディレクトリからそのイメージをビルドします。このことは docker-compose.ymlbuild: . という記述行において指示されています。

    web サービスイメージがビルドされると Compose はこのイメージを起動し、コンテナ内でコマンド django-admin 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
    

    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 におけるデータベース接続の設定を行います。

  1. プロジェクト・ディレクトリにおいて composeexample/settings.py ファイルを編集します。
  1. DATABASES = ... の部分を以下のように書き換えます。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

上の設定は docker-compose.yml に指定した Docker イメージ postgres が定めている内容です。

  1. ファイルを保存して閉じます。
  1. プロジェクトのトップ・ディレクトリにおいてコマンド 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 )。

    Django の例

    注釈

    特定プラットフォーム(Windows 10)では、 settings.py ファイル内の ALLOWED_HOSTS に、ホスト名あるいはホストの IP アドレスを追加することが必要かもしれません。 ここはデモが目的なので、以下のように設定することにします。

    ALLOWED_HOSTS = ['*']
    

    この設定は本番環境では 安全ではありません 。 詳しくは Django ドキュメント を参照してください。

  1. 起動しているコンテナの一覧を確認します。

    別の端末画面を開いて 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
    
  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