Docker Compose入門
Dockerを利用したアプリケーションでは、1つのコンテナだけで構成されるケースだけでなく、Webサーバー、アプリケーションサーバー、データベースなど、複数のコンテナを組み合わせて構築するケースが一般的です。
例えば、以下のような構成が考えられます。
クライアント
↓
Nginx
↓
FastAPI
↓
PostgreSQL
このような複数コンテナを個別に docker run で起動すると、コンテナ名、ポート、環境変数、ネットワークなどを毎回指定する必要があります。
Docker Composeは、このような複数コンテナで構成されるアプリケーションを、設定ファイルに定義してまとめて管理するための仕組みです。
1. Docker Composeとは
Docker Composeでは、アプリケーションを構成するコンテナを compose.yaml というYAMLファイルに定義します。
例えば、NginxとPostgreSQLを利用する構成であれば、以下のように定義できます。
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: password
POSTGRES_DB: sample
この設定では、2つのサービスを定義しています。
nginx:Nginxコンテナdb:PostgreSQLコンテナ
Composeでは、これらを1つのアプリケーションとして管理できます。
2. compose.yamlの基本構造
現在のDocker Composeでは、基本的に以下のような形式で設定します。
services:
サービス名:
image: 使用するイメージ
ports:
- "ホスト側ポート:コンテナ側ポート"
services の下に、アプリケーションを構成する各コンテナを定義します。
例えば、
services:
web:
image: nginx:latest
db:
image: postgres:16
と記述した場合、web と db という2つのサービスが作成されます。
サービス名はCompose内部でコンテナ間通信を行う際のホスト名としても利用できます。
例えば、FastAPIからPostgreSQLへ接続する場合、PostgreSQLのサービス名が db であれば、接続先として以下を指定できます。
db:5432
localhost:5432 ではない点が重要です。
3. Docker Composeの起動
compose.yaml を作成したディレクトリで、以下を実行します。
docker compose up -d
-d を指定すると、バックグラウンドでコンテナが起動します。
起動状態は以下で確認できます。
docker compose ps
ログを確認する場合は、
docker compose logs
特定のサービスだけ確認する場合は、
docker compose logs nginx
のように指定できます。
4. Docker Composeの停止
構成したコンテナを停止・削除する場合は、
docker compose down
を使用します。
docker stop や docker rm を個別に実行する必要はありません。
Docker Composeでは、compose.yaml に定義されたアプリケーション単位でコンテナを管理できます。
5. FastAPIとPostgreSQLを構成する
Docker Composeの特徴を理解するため、FastAPIとPostgreSQLを組み合わせた構成を考えます。
Docker Compose
┌────────────────────────────────────┐
│ │
│ ┌──────────┐ │
│ │ Nginx │ │
│ │ :80 │ │
│ └────┬─────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ FastAPI │ │
│ │ :8000 │ │
│ └────┬─────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │PostgreSQL│ │
│ │ :5432 │ │
│ └──────────┘ │
│ │
└────────────────────────────────────┘
この構成では、3つのサービスを定義します。
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
depends_on:
- api
api:
build: ./api
environment:
DB_HOST: db
DB_PORT: 5432
DB_NAME: sample
DB_USER: app
DB_PASSWORD: password
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_DB: sample
POSTGRES_USER: app
POSTGRES_PASSWORD: password
ここでは、
nginxが外部からのHTTPリクエストを受け取るapiがFastAPIアプリケーションを実行するdbがPostgreSQLを実行する
という役割分担になります。
6. build と image の違い
Composeでは、コンテナの作成方法として image と build を使用できます。
image
既存のDockerイメージを使用します。
db:
image: postgres:16
Docker Hubなどに存在するイメージをそのまま利用できます。
build
Dockerfileからイメージを作成します。
api:
build: ./api
例えば、
project/
├── compose.yaml
└── api/
├── Dockerfile
└── main.py
という構成の場合、
api:
build: ./api
とすることで、apiディレクトリにあるDockerfileを使用してイメージをビルドできます。
7. 環境変数の設定
PostgreSQLなどのサービスでは、環境変数によって初期設定を指定できます。
environment:
POSTGRES_DB: sample
POSTGRES_USER: app
POSTGRES_PASSWORD: password
FastAPI側からPostgreSQLへ接続する場合も、環境変数を利用できます。
environment:
DB_HOST: db
DB_PORT: 5432
DB_NAME: sample
DB_USER: app
DB_PASSWORD: password
ここで DB_HOST が db になっているのは、Composeによってサービス間のネットワークが構成されるためです。
8. ポート公開とコンテナ間通信
以下の設定を指定すると、
ports:
- "8080:80"
ホストOSの8080番ポートから、コンテナの80番ポートへアクセスできます。
http://localhost:8080
↓
ホスト :8080
↓
Nginx :80
一方、FastAPIからPostgreSQLへ接続する場合、PostgreSQLの5432番ポートをホストへ公開する必要はありません。
FastAPI
↓
db:5432
↓
PostgreSQL
同じComposeネットワーク内であれば、サービス名を利用して通信できます。
この仕組みにより、外部へ公開する必要のないデータベースポートを閉じた状態で構成できます。
9. よく使用するコマンド
Docker Composeでは、以下のコマンドを使用する機会が多くなります。
# コンテナを起動
docker compose up -d
# コンテナの状態を確認
docker compose ps
# ログを確認
docker compose logs
# 特定サービスのログを確認
docker compose logs api
# コンテナを再起動
docker compose restart
# コンテナを停止・削除
docker compose down
# イメージを再ビルドして起動
docker compose up -d --build
設定やDockerfileを変更した場合は、
docker compose up -d --build
を使用すると、イメージの再ビルドとコンテナの起動をまとめて実行できます。
10. Docker Composeを利用するメリット
Docker Composeを利用すると、複数コンテナの構成をYAMLファイルとして管理できます。
主なメリットは以下のとおりです。
- 複数コンテナをまとめて起動できる
- コンテナ間のネットワークを自動的に構成できる
- 環境変数を設定ファイルで管理できる
- Dockerfileと組み合わせてアプリケーション環境を構築できる
- 開発環境を他の環境へ再現しやすい
- 起動・停止・ログ確認などをComposeコマンドで統一できる
特に、Nginx、FastAPI、PostgreSQLのような複数のサービスを利用するアプリケーションでは、各コンテナを個別に管理するよりも、Composeで構成をまとめて管理する方が運用しやすくなります。
まとめ
Docker Composeは、複数のコンテナから構成されるアプリケーションを定義・起動・停止するための仕組みです。
compose.yaml にサービス、イメージ、ポート、環境変数などを定義することで、アプリケーション全体の構成をコードとして管理できます。
単一コンテナの操作では docker run が基本となりますが、複数コンテナの構成ではDocker Composeを利用することで、環境構築と管理を大幅に簡略化できます。