先にキャッシュ、次にサイト
通販サイトには、Web サーバーとキャッシュが要ります。手で1つずつ起動すると、長いコマンドを、正しい順に、正しい名前で打つことになります。
3回目に、だれかが順番を逆にして起動します。1つのファイルなら、1度書けば全員に通じます。
このレッスンのゴール
メモ
1つの Compose ファイルで、連携する2つのサービスを書き表すことができる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| サービス | Compose ファイルの1つのプログラム。1つ以上のコンテナで動く | |
| Compose ファイル | サービスとそのつながりを書いたテキストファイル | |
| 公開ポート | コンテナの入り口を、ホストで開いたもの | 8080:80 |
| depends_on | あるサービスが別のサービスを待つ決まり | |
| ヘルスチェック | サービスが応答するかを、Docker が繰り返す確認 |
学生が入力するセルは、このプレビューでは空白です。
ラボにできないこと
メモ
ラボの端末に docker compose のコマンドはありません。ラボは3つのサービスを、ファイルを編集で開ける Compose ファイルから起動しました。このレッスンのファイルは私たちのマシンで動かしました。あなたは読み、ラボのファイルが何をしたかを見て、課題で起動順を確かめます。
1つのファイルがすべてのサービスを書く
services: の下に、各サービスの名前と、動かすイメージを書きます。ほかのキーが、つながりを決めます。入り口、設定、保存するボリューム、待つ相手です。
docker compose up はファイルを読み、すべてを正しい順に起動します。Web サーバーとキャッシュの例です。
1つの Compose ファイルの2つのサービス
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
environment:
CACHE_HOST: cache
depends_on:
cache:
condition: service_healthy
cache:
image: valkey/valkey:8.1-alpine
healthcheck:
test: ["CMD", "valkey-cli", "ping"]
interval: 3s
volumes:
- cache-data:/data
volumes:
cache-data:
サービス名で cache を見つける
docker exec web getent hosts cacheここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
どのサービスがいつ起動したか
docker inspect --format '{{.Name}} {{.State.StartedAt}}' web cache workerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 各キーの働き
| キー | 働き | 見えたこと |
|---|---|---|
| image | 動かすイメージを決める | ラボは nginx と valkey を動かす |
| depends_on | あるサービスに別のサービスを待たせる | ラボでは、worker が web と cache の数秒後に起動した |
| healthcheck | サービスの確認のしかたを Docker に教える | cache は valkey-cli ping に答えるので healthy |
| environment | プログラムに設定を渡す | printenv CACHE_HOST は cache と出た |
| volumes | コンテナの外にフォルダを残す | サービスを消しても cache-data は残る |
学生が入力するセルは、このプレビューでは空白です。
公開ポートは入り口を開ける
ネットワークの中では、サービスは名前で届き合います。ホストにいる訪問者には、入り口が要ります。
"8080:80" は、ホストのポート 8080 をコンテナのポート 80 に向ける、という意味です。ホスト側が先です。私たちのマシンでは curl http://localhost:8080 が 200 を返しました。ラボの web には公開ポートがありません。届くのは、ほかのサービスと、ラボの開くボタンだけです。
よくある間違い
注意
depends_on は、相手のプログラムの準備ができるまで待つ、と考える人がいます。それだけでは、相手のコンテナが起動するまでしか待ちません。相手にヘルスチェックをつけ、condition: service_healthy を使います。すると web は、cache が答えるときにだけ起動します。
web で共有フォルダに書ける?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
worker では?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' workerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一歩先へ
例のファイルに3つ目のサービスを足しましょう。web と cache の両方に依存する worker です。書くのは3行だけです。名前、イメージ、depends_on です。
そのあと、Compose が3つをどの順に起動するかを考えます。課題は、どんなリストでも同じことを尋ねます。