Dock Stay
複数コンテナをまとめて扱う - docker compose の使い方・オプション・サンプル

複数コンテナをまとめて扱う - docker compose

複数コンテナをまとめて起動・停止するための compose.yml。services / networks / volumes の 3 ブロックで構成され、`docker compose up -d` と `docker compose down` が中心操作になる。

概念図

docker compose diagram

構文

bash

実例

3 つのサービスを束ねる最小構成の compose.yml

bash
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:

起動・一覧確認・ログ追跡・ボリューム込みの停止

bash
docker compose up -d
docker compose ps
docker compose logs -f api
docker compose down --volumes

compose.yml の最小例

compose.yml は「services に複数のコンテナ定義を並べ、必要なら networks と volumes を追加する」というシンプルな構造を持つ。

image で既成イメージを使うサービスと、build でローカルの Dockerfile を指定するサービスを混在させてよい。

ポート公開は ports、環境変数は environment、永続化は名前付き volume を参照する書き方が基本になる。

サービス間は標準で同じネットワークに入り、サービス名で DNS 解決できるので、api から db:5432 のような接続文字列が動く。

compose.yml だけで「Dockerfile・ネットワーク・ボリューム・環境変数」を一箇所にまとめられる点が単体 docker run との大きな違いになる。

bash
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 の再実行時には特に注意する。

bash
docker compose up -d --build
docker compose stop
docker compose down
docker compose down --volumes --remove-orphans

V1 (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 では不要で、書いても無視される。

関連トピック