Skip to main content

第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つ👇

  1. タブ禁止!スペースだけ(事故の8割ここ😇)(HashiCorp Help Center)
  2. 同じ深さは同じインデント幅(2スペ or 4スペ、どっちでもOKだけど混ぜない)(DEV Community)
  3. **リストは -(ハイフン)**で並べる (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: の直下に webredis が並んでる 👉 “同じ深さにある=同列の登場人物” 🎭🎭
  • redis には ports がない 👉 外から直接アクセスしない裏方(あとでAPIやWorkerが使う)🧰

💡 Composeは、同じ compose.yamlservices 同士を 基本的に同じネットワークに入れてくれるので、サービス同士は繋がりやすいです(この感覚は第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 で「起動できた!」を最短で作ります🧰🚀