• システム開発に関わる内容をざっくりと書いていく

Docker ポートが開かない / 繋がらない切り分け

コンテナは Up なのにブラウザや curl が繋がらない——ポート公開の取り違え、アプリの待ち受けアドレス、ホスト側ファイアウォールが定番どころ。内側では動いているのに外側だけ届かない、を順に潰す。

先に結論

  • -p ホスト:コンテナ の向きと番号を取り違えていないか確認
  • アプリが 127.0.0.1 だけ待ち受けしていないか(コンテナ外から届かない)
  • 先に docker exec でコンテナ内 localhost 疎通→ホストから疎通、の順で切り分ける
  • Compose のサービス名通信とホスト公開は別物。混同しやすい

切り分け手順

  • docker ps の PORTS 列で本当に publish されているか見る
  • コンテナ内でアプリの待ち受けポートに疎通できるか確認
  • ホストから localhost:公開ポート へ疎通
  • 別マシンから届かないならホスト FW/クラウド SG/WSL の罠を疑う
  • IPv6 だけ見ている/IPv4 だけ見ているズレにも注意

よくある原因

  • -p 8080:80 とアプリ待ち受け 8080 の取り違え
  • EXPOSE だけ書いて publish していない(EXPOSE は文書化に近い)
  • アプリが 127.0.0.1 バインド(0.0.0.0 が必要なことが多い)
  • 別ネットワーク/別 Compose プロジェクトで繋がっていない
  • 既にホスト側ポートが使用中で別ポートにズレた

対処のポイント

  • バインドアドレスを 0.0.0.0(または明示の外部向け)に直す
  • publish 設定をログ/compose で再確認し、番号を揃える
  • 開発機なら一度 curl の経路(コンテナ内→ホスト→外部)をメモに残すと再発時が速い

ざっくりまとめ

  • 内側疎通と外側疎通を分けて見る
  • publish 向き・待ち受けアドレス・FW が三大原因
  • EXPOSE だけでは外に開かない

関連記事