はじめに
Docker Composeについて、基本的な使い方の解説と具体的な例としてDjango/PostgreSQLアプリを構築をしてみたいと思います。
Dockerについてはこちらで解説しています。

環境
DocerとDocker Composeのバージョンは以下のようになっています。
❯ docker --version
Docker version 20.10.6, build 370c289
❯ docker-compose --version
docker-compose version 1.29.1, build c34c88b2
Docker Composeとは
Docker Composeとは、yaml形式の設定ファイルで複数のコンテナの管理ができるツールです。設定ファイルがあれば、コマンド1つでコンテナの実行ができます。
利用例としては、開発環境や自動テストの環境、単一ホストへのデプロイなどで使われるようです。
基本的な使い方
ここからはDocker Composeの基本的な使い方について解説します。
1. Dockerfileの作成
まずは、アプリケーション環境となるDockerイメージを構築するDockerfileを用意します。
2. Composeファイルの作成
docker-compose.yml
ファイルを作成します。
こちらが実行するコンテナの設定となります。
version: '3' # docker-compose.ymlのフォーマットのバージョン
services: # サービス定義
web: # webコンテナ(実行するコンテナ)
build: . # カレントディレクトリのDockerfileのビルド
ports: # ポートフォワーディング
- "5000:5000" # ホスト側:コンテナ側
redis: # redisコンテナ(実行するコンテナ)
image: "redis:alpine" # Docker Hubのredisイメージ取得
他にも設定オプションはありますので、下記ドキュメントを参照してください。

3. コンテナの実行
設定ファイルを元にコンテナの実行をします。
> docker-compose up
基本的なコマンド
基本的なコマンドを一部紹介します。
サービスをイメージからビルド
docker-compose build [options]

サービスを開始
docker-compose start [options]

サービスを作成・開始
docker-compose up [options]

サービスの停止
docker-compose stop [options]

サービスの削除
docker-compose rm [options]

サービスの停止・削除
docker-compose down [options]

コマンドの実行
docker-compose run [options]

コンテナ一覧の表示
docker-compose ps [options]

ログを表示
docker-compose logs [options]

Django/PostgreSQLアプリを構築してみる
具体的な使用例として、DjangoとPostgreSQLのアプリをDocker Composeで実行してみます。
1. ディレクトリの用意
プロジェクト用のディレクトリを作成します。
> mkdir docker-compose-django
2. Dockerfileの作成
python:3
イメージを元にし、code
ディレクトリを作成、必要なパッケージをインストールするようなイメージのDockerfileを定義します。
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
3. 必要なファイルの準備
Dockerfileで利用していたrequirements.txt
を作成します。
Django>=1.8,<2.0
psycopg2
4. docker-compose.ymlの作成
docker-compose.yml
を作成します。
Djangoが動くweb
サービスとPostgreSQLが動くdb
サービスを定義しています。
version: "3"
services:
db:
image: postgres
ports:
- "5432"
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
プロジェクト配下は以下のようになります。
❯ ls
Dockerfile docker-compose.yml requirements.txt
5. Djangoプロジェクトの作成
docker-compose run
を使って、Djangoのプロジェクトを生成します。
❯ docker-compose run web django-admin.py startproject composeexample .
Djangoのプロジェクトが作成され、プロジェクト配下は以下のようになります。
❯ ls
Dockerfile composeexample docker-compose.yml manage.py requirements.txt
6. データベース接続設定
Djangoのデータベース接続設定を行ます。
composeexample/settings.py
のデータベース設定部分を修正します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
7. コンテナの実行
コンテナの実行をします。
❯ docker-compose up -d
Docker Compose is now in the Docker CLI, try `docker compose up`
Starting docker-compose-django_db_1 ... done
Starting docker-compose-django_web_1 ... done
http://localhost:8000
にアクセスするとDjangoアプリケーションにアクセスできます。
8. コンテナの停止
最後に実行したコンテナの停止と削除をします。
❯ docker-compose down
Stopping docker-compose-django_web_1 ... done
Stopping docker-compose-django_db_1 ... done
Removing docker-compose-django_web_1 ... done
Removing docker-compose-django_db_1 ... done
Removing docker-compose-django_web_run_51f0ec3cb8e3 ... done
Removing network docker-compose-django_default
まとめ
- Docker Composeを使うと1コマンドで複数コンテナを実行できる