第09章:Dockerネットワークの超復習🌐🐳
この章でやることはシンプルだよ👇 **「コンテナ同士は“同じネットワークにいると、名前で通信できる”」**を体に染み込ませます💪✨ これが分かると、リバースプロキシは “名前に流すだけ” の世界になる👍
(Compose のネットワークは、基本的に「プロジェクトごとにデフォルトネットワークが1個できて、サービス名で見つけられる」って挙動が土台だよ〜)(Docker Documentation)
1) まずは“3つの世界”を分けよう🌍🧠
Dockerで混乱する最大の原因はこれ👇 **「localhost が誰の localhost なのか」**が毎回変わること😵💫
| あなたがいる場所 | localhost が指すもの | 例 |
|---|---|---|
| ブラウザ(ホスト側)🪟 | ホストPC自身 | http://localhost:5173 |
| コンテナAの中🐳 | コンテナA自身 | コンテナAで curl http://localhost |
| コンテナBの中🐳 | コンテナB自身 | コンテナBで curl http://localhost |
なので、コンテナAからコンテナBへ行くときに localhost を使うのはだいたい事故です💥
代わりに使うのが “サービス名(=名前)” だよ✨(Docker Documentation)
2) “ネットワーク”は「同じ部屋」だと思おう🏠🧵
Dockerネットワークは、ざっくり言うと👇
- 同じネットワーク=同じ部屋にいる🧑🤝🧑
- 別ネットワーク=部屋が違う(基本会えない)🚪🚫
- 同じ部屋だと、**名前で呼べる(サービスディスカバリ)**📛✨
特に大事なのがここ👇 ユーザー定義ネットワークでは、コンテナは“コンテナ名/サービス名”で通信できる(IP直打ちじゃなくてOK)(Docker Documentation)
3) Composeの“デフォルトネットワーク”超重要ポイント✅
Compose は基本こう動きます👇
- プロジェクトを立ち上げると、そのプロジェクト専用のネットワークが作られる
- そのネットワーク上で、各サービスは サービス名で見つけられる
- ネットワーク名は **プロジェクト名(ディレクトリ名等)**ベースになる(上書きもできる)(Docker Documentation)
ここ、後の章で「共通の入口(リバプロ)を別スタックに切り出す」時に効いてくるよ〜🚪✨
4) 手を動かす:名前でつながるのを体感しよう🧪🔗
やること🎯
webというサービス(nginx)を立てるtesterからhttp://webにアクセスしてみる- ついでに「
localhost事故」をわざと踏む😇
compose.yml を作る📝
(ファイル名は compose.yml でも docker-compose.yml でもOK)
services:
web:
image: nginx:alpine
tester:
image: curlimages/curl:8.6.0
command: ["sleep", "infinity"]
起動🚀
docker compose up -d
✅ “名前でアクセス”してみる
docker compose exec tester curl -I http://web
たぶん HTTP/1.1 200 OK みたいなのが返るはず🎉
これが **「同じネットワークにいるから、web って名前で解決できた」**ってこと!(Docker Documentation)
💥 わざと事故る:localhost を叩く
docker compose exec tester curl -I http://localhost
これはたいてい失敗するか、別の何かになる(= tester自身を見に行く)よね😇 **「コンテナ間通信に localhost は使わない」**が刺さったら勝ち✌️
5) “つながらないのが正しい”を作れると設計っぽくなる🧠🧱
ネットワークを分ける=安全な壁を作るってことです🧱✨ Composeはネットワークを複数作って、サービスを分離できるよ(Docker Documentation)
たとえば概念として👇
front:入口側(リバプロ、フロント)🌐back:内部側(DB、内部API)🔒appだけが両方に参加して橋渡し🌉
同じネットワークを共有してないサービス同士は、基本的に会えない → これが「事故の拡大」を止める最小の設計になるよ👍(Docker Documentation)
6) リバプロ視点での“合言葉”🚪➡️🏠
リバプロがやることは、結局これ👇
- 外(ブラウザ)から来たリクエストを受ける🌐
- 中(Dockerネットワーク)にいるサービスへ流す🐳
- 流し先は
http://サービス名:ポートで書けると楽✨
つまり、リバプロが web に流したいなら
同じネットワークに入って、web という名前が引ける状態にしておけばOK👌
(Traefik系はラベルで設定を拾う文化が強いけど、どのみち「同じネットワーク上で名前/到達性がある」前提は変わらないよ)(Traefik Labs Documentation)
7) よくある詰まりポイント集📕🧯(超あるある)
❶ 502(Bad Gateway)が出る😇
だいたい原因はこれ👇
- 流し先が
localhostになってる(= リバプロ自身を見に行ってる)💥 - リバプロが相手のいるネットワークに入ってない🚫
- ポートを間違えてる🔢
👉 まずは 同じネットワークにいるかを確認!
❷ 「サービス名で引けない」=ネットワークが違う説が濃厚🕵️
Composeの基本挙動(同一ネットワーク&サービス名で発見可能)を思い出そう!(Docker Documentation) サービスが複数ネットワークに属する場合もあるので、どこに繋がってるかを見るのが早いよ👀
docker network ls
docker compose ps
docker network inspect <ネットワーク名>
❸ “別プロジェクト”と共通ネットワークを作ったら名前衝突した😵💫
外部ネットワーク(複数Composeで共有)をやると、 同じサービス名が同じネットワークに存在しうる⚠️
この時に使うのが network alias(別名) なんだけど、注意点があるよ👇
- alias はネットワーク単位
- 同じaliasを複数が共有すると、どれに解決されるか保証されない(ランダムっぽくなる)(Docker Documentation)
👉 なので現場のコツはこれ:
- 共有ネットワークに出すサービス名は プロジェクト接頭辞付きでユニークに(例:
shop_api) - どうしても共通名が欲しい時だけ alias を慎重に使う🧠
❹ 急にDNSが死んだっぽい(名前解決が不安定)🌀
まれに Docker Engine の特定バージョンで embedded DNS 周りの不具合報告が出ることがあります。
例として、あるバージョン更新で 127.0.0.11 のDNSが壊れたという報告が上がってたよ。(GitHub)
👉 対処の“勝ち筋”はだいたいこのへん👇
- Docker Desktop を再起動🔁
- Engine/ Desktop を更新(または問題バージョンを避ける)⬆️
- ネットワーク作り直し(
docker compose down→up)🧹
8) ここだけ覚えれば勝てる✅✨(ミニ暗記カード)
- コンテナ間通信は
localhostじゃない🧨 - 同じネットワークなら サービス名で届く📛(Docker Documentation)
- “分離”したいなら ネットワークを分ける🧱(Docker Documentation)
- リバプロは 同じネットワークに参加して、名前へ流す🚪➡️🏠
9) ミニ課題🎒✍️(10〜20分)
課題A:web2 を増やして、名前で叩き分けよう🎯
web2(nginx)を追加testerからhttp://web2にもアクセスしてみる
課題B:ネットワーク分離を“わざと”作ってみよう🧱
webとtesterを別ネットワークにして起動http://webが失敗するのを確認- 同じネットワークに戻して復旧!
10) AIに投げると爆速になる“質問テンプレ”🤖⚡
コピペして使ってOKだよ👇
- 「この compose.yml で
testerからwebに繋がらない。ネットワーク観点で疑うポイントを順にチェックリスト化して」 - 「リバプロ(Traefik/Caddy/Nginx)が
apiに 502 を出す。localhost事故を含めて原因候補を優先度順に」 - 「複数Composeで external network を共有したい。サービス名衝突を避ける命名ルールを提案して」(Docker Documentation)
次の章(第10章)では、この“ネットワーク感覚”をそのまま使って、Composeでのサービス間通信を設計っぽく整理していくよ🧩🔗 「入口(外)と内部(中)を分けて考える」やつね🚪✨