第02章:最小のcompose.yamlを読めるようになる📄👀
この章は「書ける」より先に、“読める”を最速で作る章です😊 読めるようになると、テンプレやサンプルを拾ってきて 自分のプロジェクトに合わせて直せるようになります💪🔥
2-1. compose.yamlって結局なに?🧩🐳
compose.yaml は、複数コンテナ構成を 1枚の設計図として書くファイルです📄✨
いまの公式の推奨は Compose Specification(Composeの仕様)ベースで、compose.yaml が“正統派の名前”です。(Docker Documentation)
ポイントだけ覚えると超ラクです👇
- ✅
services:は必須(登場人物リスト🎭) - ✅
compose.yamlが優先される(docker-compose.ymlなどは互換のために残ってる感じ)(MatsuAnd) - ✅ 昔よく見た
version:は いまは基本“書かなくてOK”(互換のために残ってるだけ、情報的な意味合い)(MatsuAnd) - ✅ さらに最近は、プロジェクト名を
name:で書ける(第4章で効いてくるやつ🏙️)(Docker Documentation)
2-2. YAMLが苦手でも読める!最低限ルール🧠🧻
YAMLは「インデント(字下げ)=階層」です。 つまり、インデントを追えば読めます👣✨
最重要ルール3つ👇
- タブ禁止!スペースだけ(事故の8割ここ😇)(HashiCorp Help Center)
- 同じ深さは同じインデント幅(2スペ or 4スペ、どっちでもOKだけど混ぜない)(DEV Community)
- **リストは
-(ハイフン)**で並べる (DiyMediaServer)
2-3. 最小のcompose.yaml(これが読めれば勝ち)🏁✨
まずは「サービス1個だけ」の最小形を見ます👀 (意味が分かればOK!暗記しなくてOK!)
services:
web:
image: nginx:alpine
ports:
- "8080:80"
これを“日本語で読む”とこうなる📖✨
-
services:👉 登場人物の一覧(ここに全部書く)🎭 -
web:👉 サービス名(自分で付けるニックネーム)📛 -
image: nginx:alpine👉 このコンテナはこのイメージで作る📦 -
ports:👉 外に公開する穴(入口)🚪 -
- "8080:80"👉 PCの8080番 → コンテナの80番へ転送🌐- 左(8080)=自分のPC側
- 右(80)=コンテナ側
💡 文字列として扱いたいもの(特にポート)は
"8080:80"みたいにクォートすると事故りにくいです👍
2-4. “最小”のまま、2サービスに増やして読む練習🧪🧠
次は「登場人物が2人になっただけ」です🙂✨ 読む量はちょい増えるけど、構造は同じ!
services:
web:
image: nginx:alpine
ports:
- "8080:80"
redis:
image: redis:7-alpine
読み方のコツ🪄
services:の直下にwebとredisが並んでる 👉 “同じ深さにある=同列の登場人物” 🎭🎭redisにはportsがない 👉 外から直接アクセスしない裏方(あとでAPIやWorkerが使う)🧰
💡 Composeは、同じ
compose.yamlのservices同士を 基本的に同じネットワークに入れてくれるので、サービス同士は繋がりやすいです(この感覚は第13章でガッツリやります)(Docker Documentation)
2-5. “よく出る単語”だけ先に辞書化📘✨
この教材で頻出のキーを、読み方だけ先に作っておきます(今は意味が薄くてもOK)😆
services:👉 登場人物一覧🎭(必須)image:👉 既製品の箱を使う📦build:👉 自分のソースから箱を作る🔨(第11章でやる)(Docker Documentation)ports:👉 外からの入口🚪environment:👉 設定値(環境変数)🔑volumes:👉 データ置き場(永続化)💾depends_on:👉 起動順の“希望”⏳(ただし万能ではない)name:👉 プロジェクト名(第4章で効く)🏷️(Docker Documentation)
2-6. 初心者がハマる“見た目バグ”あるある🧯😇
あるある1:タブを混ぜる☠️
YAMLはタブに厳しいです。スペースだけにしようね🙏(HashiCorp Help Center)
あるある2:インデントがズレる🫠
ports: の下の - が浅い/深いだけで別物になります。
**「親より子が1段深い」**を守ればOK👍
あるある3:version: を書くべき?問題🤔
最近の仕様(Compose Specification)では、version: は基本不要です。
サンプルに残ってても「古い書き方が混じってるだけ」くらいでOK👌(MatsuAnd)
2-7. AI(Copilot/Codex)で“読みやすい叩き台”を作る🤖🧠✨
ここ、めちゃ効きます🔥 AIに「最小で」「読みやすく」「余計なキー入れないで」って言うのがコツです👌
そのままコピペで使えるプロンプト例🪄
Compose Specificationベースで、compose.yamlの最小例を作って。
サービスは web(nginx:alpine) と redis(redis:7-alpine) の2つ。
webは ports で 8080:80 を公開。
version: は書かない。
初心者が読みやすいように、キーは最小限・インデントは2スペースで。
AI出力をチェックするミニチェックリスト✅
services:がトップにある?🎭version:を勝手に入れてない?(入ってたら消してOK)🧹(MatsuAnd)- インデントが揃ってる?(タブなし)📏(HashiCorp Help Center)
- ポートは
"8080:80"みたいに文字列で書かれてる?🚪
2-8. ミニ問題(読めたら合格🎓✨)📝😆
次のcompose.yamlを見て答えてね👇
services:
api:
image: node:22-alpine
ports:
- "3000:3000"
environment:
- NODE_ENV=development
db:
image: postgres:16-alpine
Q1. サービスはいくつ?
Q2. 外部(PC側)から直接アクセスできるのはどれ?
Q3. api の公開ポートは PC側いくつ? コンテナ側いくつ?
Q4. environment は “何のための枠”っぽい?
Q5. db に ports がないのはどういう意図っぽい?
✅ 目標:**「services → 各サービス名 → その中のキー」**の順で迷わず追えること🎯
まとめ🎉📌
この章でできるようになったことはこれ👇
compose.yamlの構造を インデントで追って読める👀✨services:を起点に、サービスごとの設定を拾える🧩- サンプルを見て「何が起きる構成か」を説明できる🎤😆
次の第3章では、いよいよ up/down/logs で「起動できた!」を最短で作ります🧰🚀