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

読む時間の目安: 5 分

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

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

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

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

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

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

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

  3. Dockerfileに以下の内容を記述します。

    # syntax=docker/dockerfile:1
    FROM python:3
    ENV PYTHONDONTWRITEBYTECODE=1
    ENV PYTHONUNBUFFERED=1
    WORKDIR /code
    COPY requirements.txt /code/
    RUN pip install -r requirements.txt
    COPY . /code/
    

    このDockerfileはまず Python 3 の親イメージから始まっています。 この親イメージには新規のディレクトリcodeが加えられます。 さらにrequirements.txtファイルに定義された Python 依存パッケージをインストールする変更が加えられています。

  4. Dockerfileを保存して閉じます。

  5. プロジェクトディレクトリにrequirements.txtというファイルを生成します。

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

  6. 上のファイルに必要となるソフトウェアを記述します。

    Django>=3.0,<4.0
    psycopg2>=2.8
    
  7. requirements.txtファイルを保存して閉じます。

  8. プロジェクトディレクトリ内にdocker-compose.ymlというファイルを生成します。

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

  9. 以下の設定内容をファイルに記述します。

    version: "3.9"
    
    services:
      db:
        image: postgres
        volumes:
          - ./data/db:/var/lib/postgresql/data
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        environment:
          - POSTGRES_NAME=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        depends_on:
          - db
    

    このファイルにはdbサービスとwebサービスという 2 つのサービスが定義されています。

    メモ

    これは開発環境においてビルドを行い、アプリケーションをポート 8000 で動作させるものです。 これを本番環境で利用しないでください。 詳しくは Django ドキュメント を参照してください。

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

Django プロジェクトの生成

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

  1. プロジェクトディレクトリに移動します。

  2. Django プロジェクトを生成するために docker-compose run コマンドを以下のように実行します。

    $ sudo docker-compose run web django-admin startproject composeexample .
    

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

    webサービスイメージがビルドされると Compose はこのイメージを起動し、コンテナー内でコマンドdjango-admin startprojectを実行します。 このコマンドは Django に対して、Django プロジェクトを組み立てるファイルやディレクトリを生成することを指示するものです。

  3. docker-composeコマンドの処理が完了したら、プロジェクト内の一覧を表示してみます。

    $ ls -l
    
    drwxr-xr-x 2 root   root   composeexample
    drwxr-xr-x 3 root   root   data
    -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 ユーザーで実行されるからです。 生成されたファイルの所有者を以下のようにして変更します。

    Postgres の関連ファイルがあるデータフォルダーに対して、そのパーミッションは変更しないでください。 これを行ってしまうと、パーミッションが原因で Postgres が起動できなくなります。

    $ sudo chown -R $USER:$USER composeexample manage.py
    

    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ファイルを編集します。

  2. DATABASES = ...の部分を以下のように書き換えます。

    # settings.py
    
    import os
    
    [...]
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': os.environ.get('POSTGRES_NAME'),
            'USER': os.environ.get('POSTGRES_USER'),
            'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
            'HOST': 'db',
            'PORT': 5432,
        }
    }
    

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

  3. ファイルを保存して閉じます。

  4. プロジェクトのトップディレクトリにおいてコマンド 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  | July 30, 2020 - 18:35:38
    web_1  | Django version 3.0.8, 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 ページを確認できます。

    Django の例

    メモ:

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

    ALLOWED_HOSTS = ['*']
    

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

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

    別の端末画面を開いてdocker psまたは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
    
  6. サービスを停止しクリアするために、以下のいずれかの方法をとります。

    • アプリケーションを実行したシェル上でCtrl-Cを入力してアプリケーションを止めます。

      Gracefully stopping... (press Ctrl+C again to force)
      Killing test_web_1 ... done
      Killing test_db_1 ... done
      
    • もう少しきれいなやり方として別のシェル画面に切り替えて、Django サンプルプロジェクトのトップディレクトリにおいて docker-compose down を実行します。

      $ 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

その他の Compose ドキュメント

documentation, docs, docker, compose, orchestration, containers