Skip to main content

第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 downup)🧹

8) ここだけ覚えれば勝てる✅✨(ミニ暗記カード)

  • コンテナ間通信は localhost じゃない🧨
  • 同じネットワークなら サービス名で届く📛(Docker Documentation)
  • “分離”したいなら ネットワークを分ける🧱(Docker Documentation)
  • リバプロは 同じネットワークに参加して、名前へ流す🚪➡️🏠

9) ミニ課題🎒✍️(10〜20分)

課題A:web2 を増やして、名前で叩き分けよう🎯

  1. web2(nginx)を追加
  2. tester から http://web2 にもアクセスしてみる

課題B:ネットワーク分離を“わざと”作ってみよう🧱

  1. webtester を別ネットワークにして起動
  2. http://web が失敗するのを確認
  3. 同じネットワークに戻して復旧!

10) AIに投げると爆速になる“質問テンプレ”🤖⚡

コピペして使ってOKだよ👇

  • 「この compose.yml で tester から web に繋がらない。ネットワーク観点で疑うポイントを順にチェックリスト化して」
  • 「リバプロ(Traefik/Caddy/Nginx)が api に 502 を出す。localhost事故を含めて原因候補を優先度順に」
  • 「複数Composeで external network を共有したい。サービス名衝突を避ける命名ルールを提案して」(Docker Documentation)

次の章(第10章)では、この“ネットワーク感覚”をそのまま使って、Composeでのサービス間通信を設計っぽく整理していくよ🧩🔗 「入口(外)と内部(中)を分けて考える」やつね🚪✨