複数コンテナをまとめて扱う - docker compose
複数コンテナをまとめて起動・停止するための compose.yml。services / networks / volumes の 3 ブロックで構成され、`docker compose up -d` と `docker compose down` が中心操作になる。
概念図
構文
実例
3 つのサービスを束ねる最小構成の compose.yml
services:
web:
image: nginx:1.27
ports:
- "8080:80"
depends_on:
- api
api:
build: ./api
environment:
DATABASE_URL: postgres://db:5432/app
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:起動・一覧確認・ログ追跡・ボリューム込みの停止
docker compose up -d
docker compose ps
docker compose logs -f api
docker compose down --volumescompose.yml の最小例
compose.yml は「services に複数のコンテナ定義を並べ、必要なら networks と volumes を追加する」というシンプルな構造を持つ。
image で既成イメージを使うサービスと、build でローカルの Dockerfile を指定するサービスを混在させてよい。
ポート公開は ports、環境変数は environment、永続化は名前付き volume を参照する書き方が基本になる。
サービス間は標準で同じネットワークに入り、サービス名で DNS 解決できるので、api から db:5432 のような接続文字列が動く。
compose.yml だけで「Dockerfile・ネットワーク・ボリューム・環境変数」を一箇所にまとめられる点が単体 docker run との大きな違いになる。
services:
web:
image: nginx:1.27
ports:
- "8080:80"
api:
build: ./api
depends_on:
- db
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:`up -d` と `down --volumes` の使い分け
docker compose up -d はバックグラウンドでサービスを起動し、イメージが無ければビルドまたは pull を行う。
すでに起動しているサービスは差分だけ再作成される。
停止は docker compose stop、削除は docker compose down。
down はコンテナとデフォルトネットワークを消すが、名前付き volume は残すのが既定動作になる。
開発中にデータベースの初期化からやり直したいときは docker compose down --volumes(または -v)で volume も消せる。
本番同然のデータが入っている環境で --volumes を付けると取り返しがつかないので、シェル履歴や CI の再実行時には特に注意する。
docker compose up -d --build
docker compose stop
docker compose down
docker compose down --volumes --remove-orphansV1 (docker-compose) と V2 (docker compose)
ハイフンありの docker-compose は Python 実装の V1 で、Docker Engine とは別の単体バイナリだった。
現在は Go で書き直された V2 がプラグインとして同梱され、スペース区切りの docker compose で呼び出す。
V2 では起動が速く、BuildKit と統合され、compose.yml(または compose.yaml)という新しいデフォルト名にも対応する。
V1 は 2023 年に EOL となっており、CI などで docker-compose を決め打ちにしているスクリプトは docker compose への移行が必要になる。
version: "3.8" のようなトップレベル version キーも V2 では不要で、書いても無視される。
関連トピック
depends_on / profiles- `depends_on` でサービスの起動順を制御し、`profiles` で dev / prod など環境ごとの有効化を切り替える。ただし起動順だけではアプリの準備完了を保証できないので healthcheck との組み合わせが必要になる。 compose.override.yml- compose.override.yml は同じディレクトリにあれば自動でマージされ、`-f base.yml -f prod.yml` で任意の差分ファイルを重ねられる。env_file と environment の優先順位も把握しておく。 volume / bind mount- volume は Docker が管理する永続領域、bind mount はホストの任意パスをそのまま見せる機能。UID/GID ズレや SELinux ラベルが原因で「書き込めない」エラーが起きがちなので、対処パターンを押さえる。 