06
第 6 章

compose.yml を読む +
docker compose を打つ

この章で学ぶこと
1compose.yml の読み方と YAML 構文の基礎
2docker compose up で複数コンテナをまとめて起動・停止
3services・ports・environment 等の基本項目の役割
4volumes・depends_on による永続化と起動順制御
5down・logs・exec 等のサブコマンドの使い分け
解説

docker compose とは

複数コンテナの構成を 1 ファイルにまとめる
compose.yml に全サービスの設定を記述し、docker compose up で一括起動・停止
docker run の手作業からの脱却
ネットワーク作成・起動順制御・ポート設定を毎回手入力する必要がなくなる
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

YAML 構文の基礎 3 点

インデント(字下げ)で入れ子を表す
深い行は浅い行の「中の項目」。スペース 2 個が 1 段階
key: value は名前と値の組
コロンの左が項目名、右がその値
- 始まりはリスト
1 つの項目に値が複数あるとき、- を付けて 1 行 1 値で並べる
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
図解

Web + DB の 2 サービス構成

docker compose up で起動される 2 サービスの全体像

composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
コード

サンプル compose.yml

Web + DB の 2 サービス構成
Node.js アプリと PostgreSQL をまとめて起動する最小構成
chapters/src/6/compose.yml
お手元のエディタでお開きください
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
実演

docker compose up -d で起動する

目的compose.yml から 2 サービスを起動し、ブラウザでアプリの動作を確認する
実行する
コマンド
$ cd src/6$ docker compose up -d$ docker compose ps
確認する
ポイント
db が Healthy、web が Started で 2 サービスとも Up / ブラウザで localhost:3000 に Hello from Docker Compose が表示される
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

よく使う 3 つの docker compose up

docker compose up(フォアグラウンド起動)
ログが画面に流れ続け、Ctrl+C で全サービスを停止
docker compose up -d(バックグラウンド起動)
すぐプロンプトに戻り、ログは docker compose logs で確認
docker compose up --build(ビルドし直して起動)
Dockerfile の変更を反映してから起動
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

services — サービスの定義

services:  web:  db:
services: の下にサービスを並べる
web と db がそれぞれ 1 つのコンテナとして起動する
name: myapp がプロジェクト名
コンテナ名の接頭辞になる(myapp-web-1, myapp-db-1)
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

image と build — イメージの用意

build: ./webimage: postgres:18
build
指定ディレクトリの Dockerfile からイメージをビルドして使う
image
既製のイメージをレジストリ(Docker Hub)から取得して使う
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

ports — ポートのマッピング

ports:  - "3000:3000"
"ホスト側:コンテナ側" の書式
左がホスト(PC 本体)、右がコンテナのポート番号
db に ports を書かない理由
コンテナ間通信だけで完結し、ホスト側のポート競合を防ぐ
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

environment — 環境変数の注入

environment:  DATABASE_URL: postgres://user:secret@db:5432/myapp
コンテナ内のプロセスに設定値を渡す
アプリは環境変数として読み取って使う
DATABASE_URL の書式
プロトコル://ユーザー:パスワード@ホスト:ポート/DB名
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
実演

web コンテナで環境変数を確認する

目的environment で渡した値がコンテナ内に届いているか確認する
実行する
コマンド
$ docker compose exec web sh/app # env/app # getent hosts db/app # exit
確認する
ポイント
env で DATABASE_URL が表示されること / getent hosts db でサービス名 db が IP アドレスに解決されること
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

volumes は 2 か所に書く

services:  db:    volumes:                  # ← サービス内:どこに何をマウントするか      - db-data:/var/lib/postgresqlvolumes:                      # ← トップレベル:ボリュームを作る宣言  db-data:
トップレベルの volumes
名前付きボリューム db-data を作るという宣言。ファイル末尾の字下げなしの位置に書く
サービス内の volumes
そのコンテナのどこに何をマウントするかの指定。db-data:/var/lib/postgresql のように使う
同じ名前でつながる
サービス内で名前付きボリュームを使うには、トップレベルに同じ名前の宣言が必要
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

volumes — 名前付きボリュームと
バインドマウント

volumes:  - db-data:/var/lib/postgresql  - ./init.sql:/docker-entrypoint-initdb.d/init.sql
左側が名前なら名前付きボリューム
Docker が管理し、compose down でもデータが残る
左側がパスならバインドマウント
ホスト側のファイルをコンテナに直接見せる
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
実演

db コンテナで volumes を確認する

目的名前付きボリュームとバインドマウントがコンテナ内に反映されているか確認する
実行する
コマンド
$ docker compose exec db bash# ls /var/lib/postgresql# ls /docker-entrypoint-initdb.d/# cat /docker-entrypoint-initdb.d/init.sql# exit
確認する
ポイント
/var/lib/postgresql にデータディレクトリがあること / /docker-entrypoint-initdb.d/ にホスト側の init.sql が見えること
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

depends_on — 起動順序の制御

depends_on:  db:    condition: service_healthy
service_healthy で応答まで待機
コンテナの起動だけでなく healthcheck が通るまで web の起動を待つ
healthcheck: test で pg_isready を実行
PostgreSQL が接続を受け付けられるか 10 秒ごとに確認
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

networks — 自動作成の
デフォルトネットワーク

Compose は default ネットワークを自動作成
全サービスが参加し、docker network ls で myapp_default として確認できる
サービス名がホスト名になる
web から db を名前で引けるのはこの DNS 機能のおかげ
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
実演

logs でサービスのログを追う

目的バックグラウンドで動いているサービスのログを確認する
実行する
コマンド
$ docker compose logs -f web
確認する
ポイント
web サービスのログがリアルタイムで表示されること / Ctrl+C で表示を終了できること
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
コマンド

docker compose exec

$ docker compose exec <service> <command>
<service>対象のサービス名(web、db など)
<command>sh や bash で対話シェル、直接コマンドなら 1 回実行
Alpine ベースは sh、Debian ベースは bash が使える
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
実演

psql でデータベースを確認する

目的exec で psql を呼び出し、DB の状態を直接確認する
実行する
コマンド
$ docker compose exec db psql -U user -d myappmyapp=# SELECT datname FROM pg_database;myapp=# \quit
確認する
ポイント
psql のプロンプトが myapp=# になること / POSTGRES_DB で指定した myapp データベースが作成されていること
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
解説

config と build

$ docker compose config$ docker compose build$ docker compose build --no-cache
docker compose config
compose.yml を解釈・展開した最終形を表示。変数の値埋め込みやタイポの確認に使う
docker compose build
イメージのビルドだけ行う(起動はしない)
docker compose build --no-cache
キャッシュを使わずに 1 からビルドし直す
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
コマンド

停止と削除の 3 コマンド

$ docker compose stop$ docker compose down$ docker compose down -v
docker compose stop
コンテナを停止する。削除はしないので docker compose start で再開できる
docker compose down
コンテナとネットワークを削除する。ボリュームは残る
docker compose down -v
ボリュームまで削除する。DB のデータも消える
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
図解

stop・down・down -v が削除するもの

3 つのコマンドが何を消して何を残すか

composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
実演

docker compose down で後片付け

目的サービスを停止・削除して後片付けする
実行する
コマンド
$ docker compose down
確認する
ポイント
2 コンテナとネットワークが Removed になること / ボリュームは削除されず残ること
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ
まとめ

この章のまとめ

compose.yml に複数コンテナの構成をまとめ、docker compose up で一括起動できる
services / image / build / ports / environment で各サービスの基本設定を定義する
volumes で永続化し、depends_on + healthcheck で起動順を制御する
自動作成される default ネットワーク内でサービス名による通信ができる
down / logs / exec 等のサブコマンドで管理・確認・操作を行う
composeとは
起動してみる
基本項目
永続化と依存
サブコマンド
使い分け
まとめ