メインコンテンツまでスキップ

第23章:よくある失敗(ポート被り/起動してない/Firewall)🔥🚪🪟

この章のゴールは 「localhost:3000 が開かない😵」を見た瞬間に、原因を3分で絞れる ようになることです💪✨ (“勘”じゃなくて、“手順”で倒す回だよ〜😊)


0) まず結論:困ったらこの3ステップだけやろう✅✅✅

  1. コンテナ起動してる?(落ちてない?)🐳
  2. ポート公開できてる?(-p / ports 書いた?)🔌
  3. ホスト側のポート、誰か使ってない?(被り)⚔️

ここまでで大半が直ります😆 それでもダメなら Firewall/セキュリティ の順で見るよ🔥🛡️


1) 症状→原因の “当たり” 早見表👀🧠

症状😵ありがちな原因😈まずやること✅
ブラウザが ERR_CONNECTION_REFUSEDコンテナ落ちてる / アプリ起動失敗docker ps -adocker 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 psdocker 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 -aExited を見つけられる
  • docker ps の PORTS 欄で 公開できてる/できてないを判断できる
  • Windowsで 3000番の犯人PID→プロセス名 まで辿れる
  • LANから見えない時に Firewall を疑う順番がわかる

次の第24章では、さらに混乱しがちな 「コンテナ内の localhost 罠」(“自分自身を指してるだけ問題”)をぶっ壊しにいくよ〜🪤😵‍💫➡️💪😄