Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:コンテナのネットワークとボリューム | 関連:DockerイメージとレイヤPod・Deployment・ReplicaSet

要点(BLUF)

概念 ── 構成を1ファイルに宣言する

実アプリは「Web + DB + キャッシュ」のように複数コンテナで成り立ちます。これを docker run で個別に起動・接続するのは手間で間違いやすい。Compose は構成全体を1つの宣言ファイルにまとめ、依存・ネットワーク・ボリュームを自動で面倒みます。前トピック(コンテナのネットワークとボリューム)の手作業が、まるごと宣言に置き換わります。

flowchart TB
    file["compose.yaml(構成の宣言)"] --> up["docker compose up"]
    up --> web["web サービス(公開:8080)"]
    up --> db["db サービス(内部のみ)"]
    up --> net["専用ネットワーク(自動作成・名前解決)"]
    up --> vol["ボリューム(自動作成・db永続化)"]
    web -->|"ホスト db で接続"| db

仕組み ── compose.yaml の構造

# compose.yaml ── Web+DB の最小構成
services:
  web:
    build: ./app              # ローカルの Dockerfile からビルド
    ports:
      - "8080:80"             # ホスト8080 → コンテナ80
    environment:
      DB_HOST: db             # サービス名で名前解決できる
    depends_on:
      - db                    # db を先に起動

  db:
    image: postgres:16        # タグ固定(latest を避ける)
    environment:
      POSTGRES_PASSWORD: example   # 開発用。本番は Secret で注入
    volumes:
      - pgdata:/var/lib/postgresql/data   # データを永続化
    # ports は書かない=外に公開しない(内部のみ)

volumes:
  pgdata:                     # 名前付きボリュームの宣言

3要素が肝。services に各コンテナ、volumes に永続化領域、そしてサービス名がそのままホスト名になる(web から db で繋がる)。ネットワークは明示しなくても専用ネットワークが自動作成され、内蔵DNSで名前解決されます。

動く例 ── ライフサイクル

# ビルドして全部まとめて起動(-d はバックグラウンド)
docker compose up -d --build
# 状態を見る
docker compose ps
# web のログだけ追う
docker compose logs -f web
# まとめて停止・削除(-v でボリュームも消す=データも消える点に注意)
docker compose down

up 一発で「ビルド → ネットワーク作成 → ボリューム作成 → 依存順に起動」まで自動。down で後片付けも一括。開発環境を捨てて作り直すのが一瞬になります。

なぜ Compose なのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/03-04_compose.yaml03-04_app/(web+db を1コマンドで起動。up -d → ブラウザ確認 → down のライフサイクルを観察)。

関連

第3章 コンテナ 目次