シンプルなDocker Compose+Django開発環境構築

#概要
以前、以下の記事にてDockerfileを利用した単一コンテナによるDjangoの開発環境構築についての方法を解説いたしました。
[シンプルなDocker+Django開発環境構築](https://qiita.com/kobahiro21/items/ff1f6c45297eb06b0081)

今回は、_Docker Compose_を使用した方法について記載いたします。

前回と同じく、シンプルな環境構築を目的としているため、データベースはDjango標準のSQLite3をそのまま利用することとしております。
#前提
Docker Desktopがインストール済みのWindowsおよびMac、またはDocker EngineとDocker Composeがインストール済みのLinuxを想定しております。

なお、WindowsとMacについては、Docker Desktop内にDocker Composeが同梱されているため、別途インストールの必要はありません。

記事内のコマンドはMacのターミナル上で実行しておりますが、Docker DesktopがインストールされていればWindowsのコマンドプロンプト上でも同様のコマンドが実行できると思われます。
#Docker Composeで複数コンテナを作成
##1. 作業用ディレクトリ作成
Dockerfileとdocker-compose.ymlを使用して、複数のDockerコンテナによるDjangoの開発環境を作成します。

ローカルマシン上に任意の作業用ディレクトリを作成し、さらにその中に`Dockerfile`、`requirements.txt`、`docker-compose.yml`という名前のファイルと、任意の名前のディレクトリを作成しておきます（ここでは_src_とします）。

```
Dockerfile
docker-compose.yml
requirements.txt
src/
```
##2. 設定ファイルの編集
Dockerfileの内容を下記の通り編集します。

```Bash:Dockerfile
FROM python:3.8.3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```
requirements.txtの内容を下記の通り編集します。

```:requirements.txt
django
pyyaml
```
docker-compose.ymlの内容を下記の通り編集します。

```yml:docker-compose.yml
version: '3'
    
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./src:/code
    ports:
      - "8000:8000"
```
Dockerfileとrequirements.txtについては[以前の記事](https://qiita.com/kobahiro21/items/ff1f6c45297eb06b0081)で解説しているため割愛します。

`docker-compose.yml`には、Webサーバー、データベース、メールサーバーなどの_サービス_を定義します。
ここでは、_web_という名前を付けたサービスのみを定義しています。

`docker-compose`コマンドでコンテナを起動する場合、ここで定義されたサービスごとにコンテナが起動します。
##3. コンテナとDjangoプロジェクトの作成
`docker-compose run`コマンドを、Dockerfileなどが存在するディレクトリ配下で実行します。
`run`の後ろにサービス名の_web_を指定することで、webサービス上の`django-admin startproject`コマンドを実行することになります。

```
$ docker-compose run web django-admin.py startproject django_prj .
```

`docker-compose.yml`内のwebサービスに記述している`build: .`により、コンテナが作成されていない場合はこのタイミングで自動的にイメージのビルドからコンテナの作成までが行われます。

Docker Desktopのダッシュボードウィンドウ上ではコンテナが作成されたことが確認できます。
<img width="320" alt="django_s_test_dashboard.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679618/4f9da658-1dfb-3c7c-4847-af7ceafa4388.png">
正常にDjangoプロジェクトが作成された場合、_src_ディレクトリ配下にプロジェクトの雛形のファイルが作成されます。

```
db.sqlite3
django_prj
manage.py
```
##4. コンテナの起動
`docker-compose up`コマンドを、Dockerfileなどが存在するディレクトリ配下で実行します。

```
$ docker-compose up
```
Docker Desktopのダッシュボードウィンドウ上ではコンテナが起動したことが確認できます。
<img width="320" alt="django_s_test_dashboard.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679618/5d2a7b0f-7288-39b0-42df-2bf957c9b741.png">
確認のため、ブラウザで`http://localhost:8000/`にアクセスします。

<img width="416" alt="django_s_test_rocket.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679618/e3da7e09-631c-00b7-215a-e679de338e67.png">
ロケットの画像があるホームページが表示されたら、正常にDjangoのプロジェクトが動作しています。
お疲れ様でした:D┼─┤

以降はDjangoの公式ドキュメントや市販の参考書等を読み進めて、コマンドの指定があった場合はコマンドの前に`docker-compose run [webサービス名]`を付けることで、Dockerコンテナ上のDjangoに対して各種操作が実行されるようになります。
#所感
Dockerと同じく、Docker ComposeとDjangoの開発環境構築の情報もまた大量にヒットしたのですが、本番環境を見据えたオーバースペックな設定のエントリーしか見当たらなかったため、自分であとで見返す用に本記事を作成しました。

なお、身も蓋もないですが、`Dockerの公式ドキュメントで解説しているDjangoコンテナの作成方法が一番分かり易い`ので、是非そちらを確認して下さい。

ドキュメント日本語化サイトにも当該ページの翻訳が存在するのですが、設定内容が本家と差異があることがあったため、英語が読めない人は設定内容は本家を参照し、解説は日本語訳ドキュメントを確認すると良いかと思います。
#参考
* [Quickstart: Compose and Django - 公式](https://docs.docker.com/compose/django/)
* [クィックスタート: Compose と Django - 公式の翻訳](https://docs.docker.jp/compose/django.html)
* [docker-compose.yml の内容を理解しよう](https://futureys.tokyo/lets-understand-contents-of-docker-compose-yml/)