第30章:ミニまとめ:Web/API開発で毎回使うネットワーク筋トレ🏋️♂️
この章は「ネットワークで詰まった時に、毎回“同じ順番”で直せるようになる」ための総復習だよ〜💪😆 (2026-02-08時点の Docker 公式ドキュメント前提で整理してるよ📚✨) (Docker Documentation)
1) まずは脳内に“3パターン”を固定しよう🧠🔒
ネットワークの詰まりは、だいたいこの3つのどれかで起きるよ👇
A. ホスト → コンテナ(ブラウザからAPIへ)🪟➡️🐳
- これは ポート公開(publish) の世界🌐
- 「ホストのポート」→「コンテナのポート」に穴あけする感じ🕳️✨
- Docker Desktop は「ホスト側で待ち受け → VMへ転送 → コンテナへ」って流れで中継してくれるよ📮 (Docker Documentation)
B. コンテナ → コンテナ(API → DB)🐳➡️🐳
- これは 同じネットワークに入れる のが基本🎯
- ユーザー定義ネットワーク だと、コンテナ名(サービス名)で名前解決できるのが超重要🏷️✨ (Docker Documentation)
C. コンテナ → ホスト(コンテナからPC上の何かへ)🐳➡️🪟
- Docker Desktop には host.docker.internal っていう “特別な名前” があるよ🧙♂️
- 「ホストのIPは状況で変わる」ので、この名前を使うのが安全👍 (Docker Documentation)
2) 今日の“筋トレメニュー”🏋️♂️🔥(やるほど強くなるやつ)
目標:公開・接続・切り分けを「手が勝手に動く」くらい反復する😆✨ 仕上げに「API+DB接続“手前”」まで通すよ🚀
筋トレ①:ポート公開の型(ホスト→コンテナ)🔌👀
①-1. “正しい待ち受け”を体感する(0.0.0.0が大事)💡
ポイント:コンテナ内で 127.0.0.1(localhost)待ち受けすると外から来れないことが多い😵 なのでまずは 0.0.0.0 で待ち受ける癖をつけるよ🏃♂️💨
docker run -d --name net-gym-api -p 3000:3000 node:24-alpine \
sh -lc "node -e \"require('http').createServer((req,res)=>{res.end('OK net-gym 🐳✨')}).listen(3000,'0.0.0.0')\""
✅ 確認(ホスト側)
- ブラウザで「localhost:3000」を開く👀✨
Docker Desktop のポート公開は、ホスト側で待ち受けてVMへ転送する仕組みだよ📮 (Docker Documentation)
①-2. “待ち受けIPを間違えると死ぬ”をわざと体験🪤😇
次はわざと「127.0.0.1」で待ち受けしてみる(外から来れない系)💥
docker rm -f net-gym-api
docker run -d --name net-gym-api -p 3000:3000 node:24-alpine \
sh -lc "node -e \"require('http').createServer((req,res)=>{res.end('OK? 🤔')}).listen(3000,'127.0.0.1')\""
✅ 確認
- ブラウザで「localhost:3000」→ うまくいかない可能性が高い😵💫 (環境によって挙動に差はあるけど、“コンテナの外から入る通信”に弱いのは確実に覚えてOK)
筋トレ②:localhost罠(“それ、自分自身”問題)🪤🏠
コンテナ内で言う「localhost」は そのコンテナ自身 のことだよ🫠 「ホスト(Windows)のlocalhost」と別物!ってのを体に染み込ませよう🔥
docker exec -it net-gym-api sh
中でこれ👇(もし curl 無ければ後述の筋トレ③で curl 専用コンテナ使うのでOK🙆♂️)
- 「localhost:3000」→ 自分(net-gym-api)
- 「host.docker.internal:xxxx」→ ホスト(Windows) (Docker Documentation)
筋トレ③:コンテナ間通信(API → DB)🐳🤝🐳
③-1. ユーザー定義ネットワークを作る🛠️
docker network create todo-net
ユーザー定義ネットワークに入れると、コンテナ名で通信できるようになるよ(これが超でかい)🏷️✨ (Docker Documentation)
③-2. DBコンテナを起動(最新系でOK)🐘✨
2026-02-08時点だと PostgreSQL の最新メジャーは18系(2025年秋リリースの流れ)だよ🐘📈 (PostgreSQL)
docker run -d --name todo-db --network todo-net \
-e POSTGRES_USER=todo \
-e POSTGRES_PASSWORD=todo_pass \
-e POSTGRES_DB=todo \
postgres:18
※もし postgres:18 が取得できない環境なら、まずは postgres:17 に落としてOK👌(学習目的なら十分) (PostgreSQL)
③-3. “APIっぽい箱”を同じネットワークで起動🐳✨
docker rm -f net-gym-api
docker run -d --name todo-api --network todo-net -p 3000:3000 node:24-alpine \
sh -lc "node -e \"require('http').createServer((req,res)=>{res.end('todo-api OK ✅')}).listen(3000,'0.0.0.0')\""
③-4. “疎通だけ”確認(DB接続の手前まで)🔍✅
ここが今回のゴールの核心🎯 まだアプリからDBへログインしない。まずは「ネットワーク的に届く?」だけを見る👀
✅ 方法A:DBの準備状態をDB側で確認(pg_isready)🐘
docker exec -it todo-db pg_isready
✅ 方法B:curl専用コンテナで「名前解決→到達」を確認🧪
(curl入りの軽量イメージを使うよ。道具箱みたいなもん🧰)
docker run --rm --network todo-net curlimages/curl:latest \
http://todo-api:3000
- これが通れば、コンテナ名で名前解決できてるってことだよ🏷️✨ (Docker Documentation)
ちなみに Docker Desktop は「ホストからコンテナへはポート公開」で行くのが基本で、コンテナのIPに直接 ping したりはできない(制限)って明言されてるよ📌 (Docker Documentation)
筋トレ④:接続文字列(connection string)の型🧵🧠✨
ここは「設計の超入門」的に、書き方のルールを決めちゃうのが勝ち🏆
④-1. “分解して環境変数”が基本🎛️
接続情報を “1本の文字列” で持つより、まずは分解がわかりやすいよ😊
- DB_HOST:todo-db(← サービス名)
- DB_PORT:5432
- DB_USER:todo
- DB_PASSWORD:todo_pass
- DB_NAME:todo
「DB_HOST に IP を書かない」が超大事ね🧠✨ 同一ネットワークなら コンテナ名でOK だから! (Docker Documentation)
④-2. “API側に設定が入ってるか”だけ確認(接続はまだ)👀
docker exec -it todo-api sh -lc "env | sort | head -n 30"
(この章は “接続手前” がゴールなので、ここまでで十分👍)
筋トレ⑤:詰まった時の切り分けテンプレ(3点セット)🧯🧠
ネットワーク詰まりを 毎回これで殴る っていうテンプレを渡すよ🥊😆 (これができると「怖くない」が手に入る✨)
✅ 3点セット①:プロセスは生きてる?(落ちてない?)💓
docker ps
docker logs --tail 80 todo-api
docker logs --tail 80 todo-db
- “起動直後に落ちる”ならネットワーク以前の問題かも😵
✅ 3点セット②:ポート公開は合ってる?(ホスト→コンテナ)🔌
docker port todo-api
- 「ホストの3000」→「コンテナの3000」になってる?👀
Docker Desktop のポート公開は、ホストで待ち受けてVMに転送する仕組みで、設定で localhost バインドに寄せることもできるよ🔧 (Docker Documentation)
✅ 3点セット③:同じネットワーク?名前解決できてる?(コンテナ→コンテナ)🏷️
docker network inspect todo-net
- todo-api と todo-db が入ってる?✅
- “default bridge” じゃなく “ユーザー定義ネットワーク” を使うと名前で繋げられるよ🏷️✨ (Docker Documentation)
3) 仕上げ:今日の達成チェック✅🎉
できたら合格〜〜〜!🥳✨
- ✅ ブラウザで「localhost:3000」にアクセスできる(ホスト→コンテナ) (Docker Documentation)
- ✅ curl専用コンテナで
http://todo-api:3000が叩ける(コンテナ名で通信) (Docker Documentation) - ✅ todo-api と todo-db が同じネットワークにいる(inspectで確認できる)
- ✅ localhost罠を言葉で説明できる(“それ自分自身”)🪤
4) AI(Copilot / Codex)に投げると強いプロンプト集🤖✨
GitHub OpenAI 系の支援ツールがある前提で、こう投げると早いよ🚀
🩺 プロンプト①:原因候補トップ3を即出し
-
「Dockerのネットワーク不調。いまの状況はこれ:
- docker ps の結果(貼る)
- docker port todo-api の結果(貼る)
- docker network inspect todo-net の結果(貼る)
- docker logs todo-api の末尾(貼る) 原因候補トップ3と、確認コマンドを順番つきで出して。」
🧭 プロンプト②:ミスを“再現→修正”で覚える課題化
- 「Docker Desktop + Node API + Postgres のネットワークで、初心者がやりがちなミスを3つ。 それぞれ『わざと失敗させる手順』→『直す手順』をコマンドで。」
🧹 プロンプト③:片付け安全手順を作る
- 「今日作ったコンテナ/ネットワークを安全に消す手順を、確認コマンド付きで短くまとめて。」
5) 後片付け(環境をキレイに)🧹✨
docker rm -f todo-api todo-db
docker network rm todo-net
ちょい補足:最近のDocker Desktopで“DNS/IPv6まわり”が詰まる人へ🧩🌀
Docker Desktop 4.42以降は「デフォルトのネットワークモード」や「DNSのフィルタ挙動」を設定で調整できて、IPv4/IPv6のミスマッチによるタイムアウトを避けやすくなってるよ🛠️ (Docker Documentation)
次の第31章からは、ここまで手でやってた複数コンテナ起動を Composeで“一発起動” にしていくよ🎉 この第30章の筋トレができてると、Composeで詰まっても直せる率が一気に上がる💪😄