第23章:よくある失敗(ポート被り/起動してない/Firewall)🔥🚪🪟
この章のゴールは 「localhost:3000 が開かない😵」を見た瞬間に、原因を3分で絞れる ようになることです💪✨ (“勘”じゃなくて、“手順”で倒す回だよ〜😊)
0) まず結論:困ったらこの3ステップだけやろう✅✅✅
- コンテナ起動してる?(落ちてない?)🐳
- ポート公開できてる?(-p / ports 書いた?)🔌
- ホスト側のポート、誰か使ってない?(被り)⚔️
ここまでで大半が直ります😆 それでもダメなら Firewall/セキュリティ の順で見るよ🔥🛡️
1) 症状→原因の “当たり” 早見表👀🧠
| 症状😵 | ありがちな原因😈 | まずやること✅ |
|---|---|---|
ブラウザが ERR_CONNECTION_REFUSED | コンテナ落ちてる / アプリ起動失敗 | docker ps -a → docker logs |
bind: address already in use | ポート被り(別アプリ or 別コンテナ) | netstat / Get-NetTCPConnection で犯人探し |
permission / “forbidden by its access permissions” | 予約ポート / セキュリティ / 特殊な占有 | netsh ... excludedportrange を見る |
| 自分のPCでは開くのに、スマホ/別PCから開かない | 127.0.0.1にしかバインドしてない / Firewall | バインド先 & Firewall ルール確認 |
Composeで ports: 書いたのに開かない | サービス名ミス / 起動失敗 / そもそも別ポート | docker compose ps → docker compose logs |
2) ハンズオン:わざと“ポート被り”を起こして直す🔥⚔️🧯
(A) 先にホスト側で「3000番」を埋める🏠🔒
VS Code のターミナル(PowerShell)で👇
node -e "require('http').createServer((req,res)=>res.end('host 3000')).listen(3000, ()=>console.log('host listening 3000'))"
この状態で http://localhost:3000 を開くと host 3000 が出るはず🙂
(B) そこへ Docker で 3000 を使おうとしてみる🐳💥
別ターミナルで👇(例として nginx を使うよ)
docker run --rm -p 3000:80 nginx
👉 だいたい 「もう使われてる!」系のエラー で止まります😇 これが ポート被り の典型!
(C) 直し方:ホスト側ポートをずらす🔁✨
docker run --rm -p 3001:80 nginx
今度は http://localhost:3001 で見えるはず🎉
🧠ポイント:
-p ホスト側:コンテナ側「ホスト側」は あなたのPCで空いてる番号 を使えばOK👍
3) “起動してない/落ちてる” を最速で見抜く🐣🔍
3-1) まず一覧!🐳📋
docker ps
- ここに出てない → 起動してない😵
- じゃあ次👇
docker ps -a
Exited がいたら、ほぼココが原因😇
3-2) すぐログ!🪵👀
docker logs <コンテナ名 or ID>
“落ちた理由”がだいたい書いてあるので、まず読む癖をつけると勝ちやすい🏆✨
4) “ポート公開できてない” を見抜く🔌🕵️
4-1) docker ps の PORTS 欄を見る👀
0.0.0.0:3000->3000/tcpみたいに出てる? → 公開できてる✅- 何も出てない?
→ 公開してない(
-p/ Composeのports:を忘れた)❌
4-2) Docker Desktop の “ポートのバインド挙動” 設定も知っておく⚙️🐳
Docker Desktop には 公開ポートをデフォルトで 0.0.0.0 にするか、localhost に寄せるか みたいな設定があります。(Docker Documentation) 開発中に「外から見えなくて助かる」こともあるし、逆に「スマホから見えない😵」原因にもなるよ〜📱💦
さらに、Docker側の“公開ポート”の考え方や安全面(localhost公開の扱い)も公式にまとまってるので、ここは一回目を通すと強いです。(Docker Documentation)
5) “ポート被り” 犯人捜し(Windows編)🕵️♂️🪟
5-1) そのポート、誰が使ってる?(PowerShell)🔍
例:3000番を調べる👇
Get-NetTCPConnection -LocalPort 3000 -State Listen | Select-Object -First 5
PID が出たら、次👇
Get-Process -Id <PID>
5-2) 昔ながらの netstat でもOK📟
netstat -ano | findstr :3000
PID がわかったら👇
tasklist /FI "PID eq <PID>"
👉 犯人が Node / VS Code / 別コンテナ / DB とかなら、止めるかポートずらすだけで解決🎯
6) “forbidden / access permissions” 系は「予約ポート」も疑う🧨🧠
Docker を動かそうとして、
- “An attempt was made to access a socket in a way forbidden by its access permissions”
- “forbidden by its access permissions”
みたいなのが出たら、Windows側でそのポート帯が予約されてる ケースがあります😵💫 確認コマンド(管理者で実行が無難)👇 (Microsoft Learn)
netsh interface ipv4 show excludedportrange protocol=tcp
予約帯にぶつかってたら、別ポートに逃がすのが一番早いです🏃♂️💨 (ここの沼は深追いすると時間溶けるので、まず逃げるのが正解になりがち😇)
7) Firewall / セキュリティで止められるパターン🛡️🔥
7-1) いつ Firewall を疑う?🧠
- ✅ 自分のPCのブラウザ(localhost)でもダメ → まずは「起動/公開/被り」を疑う(Firewall率はそこまで高くない)
- ✅ 別PC/スマホ(LAN)からだけ見えない → Firewall が“本命”になりやすい📱🔥
Docker Desktop の通信は、Firewall や endpoint protection(企業のセキュリティ系)からも見える・影響されることがあるよ、と公式にも書かれてます。(Docker Documentation)
7-2) ポートを許可する(PowerShell例)🧯
Windows Firewall は PowerShell / netsh で操作できる ので、検証が速いです。(Microsoft Learn)
New-NetFirewallRule でルール作成も可能。(Microsoft Learn)
例:TCP 3000 を受け入れ(必要なら)👇
New-NetFirewallRule -DisplayName "Allow TCP 3000 (Dev)" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3000
⚠️注意:むやみに全開放は危険だよ😱 “LAN内だけで使う” とか “Privateプロファイルだけ” みたいに絞る運用が基本(会社PCなら特に)🛡️✨
8) AIに投げると爆速になる質問テンプレ🤖⚡
(1) エラー文を貼るだけで“当たり”を出す🎯
- 「このエラーの原因候補トップ3と、確認コマンドを順番に出して」
- 「Windows + Docker Desktop + WSL2 前提で、最短の切り分け手順にして」
(2) ログ要約(長いログを1分で読む)🪵✂️
- 「このログを3行に要約して、次に見るべき設定/ファイル名を挙げて」
(3) ポート被り調査の自動化🛠️
- 「PowerShellで“指定ポートのLISTENプロセス名とPIDを出す”ワンライナー作って」
9) 章末ミニチェック✅🎓
-
docker ps -aで Exited を見つけられる -
docker psの PORTS 欄で 公開できてる/できてないを判断できる - Windowsで 3000番の犯人PID→プロセス名 まで辿れる
- LANから見えない時に Firewall を疑う順番がわかる
次の第24章では、さらに混乱しがちな 「コンテナ内の localhost 罠」(“自分自身を指してるだけ問題”)をぶっ壊しにいくよ〜🪤😵💫➡️💪😄