DockerでWebアプリを立ち上げたとき、ホスト(PC)のブラウザから localhost:8000
などでアクセスしようとしても接続できないことがあります。
これはアプリケーションのバインドアドレスとDockerのポートマッピングの関係を正しく理解していないと起きる典型的なトラブルです。
よくある症状
アプリ起動: アプリが 127.0.0.1:8000 で起動
→ そのままでは ホストのブラウザからアクセスできない
表示されるエラー例:
- 「このサイトにアクセスできません」
- ERR_EMPTY_RESPONSE
- ERR_CONNECTION_REFUSED
原因:127.0.0.1 にバインドしている
127.0.0.1 は「localhost(自分自身)」を表す特殊なIPアドレスです。
Dockerコンテナ内でアプリが 127.0.0.1:ポート番号
にバインドされている場合、それは**「コンテナ内部からしかアクセスできない」**という意味になります。
解決策:0.0.0.0 にバインドする
アプリを起動するとき、次のように 0.0.0.0
にバインドすると、コンテナ外からアクセスできるようになります。
起動例(フレームワークにより異なる):
例)--host 0.0.0.0
例)bind 0.0.0.0:8000
0.0.0.0
は「すべてのネットワークインターフェース」を意味します。
これにより、Dockerのポートフォワーディングと連携してホストからアクセス可能になります。
Docker Composeでの設定(例)
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000" # ホストの8000番 → コンテナの8000番
volumes:
- .:/app
この例では、ホストの localhost:8000
にアクセスすると、コンテナの 8000
番ポートに転送されます。
正常にアクセスできる構成まとめ
状況 | アプリのバインド先 | Dockerの ports 設定 | ホストからアクセス |
---|---|---|---|
❌ アクセス不可 | 127.0.0.1:8000 |
8000:8000 |
✕(コンテナ外から見えない) |
✅ アクセス可能 | 0.0.0.0:8000 |
8000:8000 |
○(コンテナ外からアクセス可) |
他の端末(スマホなど)からアクセスするには?
以下の条件を満たせば、同じLAN内のスマホなどからPC上のDockerアプリにアクセスできます:
1.アプリが 0.0.0.0 にバインドされている
2. Dockerの ports で該当ポートが公開されている
3. ホストOSの ファイアウォールでポートを開放している
4. アクセス先は「ホストPCのローカルIPアドレス」
スマホから http://192.168.x.x:8000
にアクセスj
192.168.x.x
はホストPCのIP。ipconfig
(Windows)や ifconfig/ip
a(Mac/Linux)で確認できます。
セキュリティに注意
-
0.0.0.0
にバインドすることで、全てのネットワークインターフェースからの接続を受け付ける状態になります。 - 開発環境では便利ですが、本番環境でそのまま使うのは危険です。
- 本番ではリバースプロキシ(nginx など)+ HTTPS を推奨します。
まとめ
- アプリが 127.0.0.1 にバインドされていると、Docker外からアクセスできない。
- 0.0.0.0 にバインドすれば、Docker外(ホストや他デバイス)からアクセス可能になる。
- Dockerの ports 設定と組み合わせて、適切に公開することが重要。