了解しました。それでは以下に、
🔖 第9章:トラブルシューティングとFAQ より
9.4 Dockerネットワークの罠(hostとbridgeの違い)
を、初心者にもわかりやすく図とたとえを交えて解説します。
bridge
と host
モード | 説明 | 特徴 |
---|---|---|
bridge |
Dockerのデフォルト。仮想ネットワークを作成し、NAT越しに通信する | 各コンテナに独立したIPアドレス(172.17.x.xなど)が振られる |
host |
コンテナがホストと同じネットワーク空間を共有する | ポートマッピング不要。localhost で直接接続できる(Linuxのみ) |
[bridgeモード](標準的なDockerネットワーク)
[Host OS]
|
[Docker Engine]
|
[Virtual Network: 172.17.0.0/16] ──────┬────────────┬────────────┐
| | | |
[appコンテナ:172.17.0.2] [auth:172.17.0.3] [nginx:172.17.0.4]
- コンテナ間は名前またはIPで通信(e.g., <http://auth:3000>)
- ホストからアクセスするには port expose(e.g., -p 3000:3000) が必要
[hostモード](開発や調査などで稀に使う)
[Host OS Network]
└─ コンテナがそのままホストのネットワークに乗る
- コンテナのlocalhostがホストと同じ → ポートマッピング不要
- セキュリティ・名前解決・分離性が低くなる
現象 | 原因 | 対応 |
---|---|---|
localhost:3000 がつながらない |
bridge モードでポートマッピングしてない |
ports: セクションを確認。3000:3000 など |
appからauthが http://localhost:3000 にアクセスしてるが動かない |
各コンテナ内の localhost は 自分自身 |
http://auth:3000 のように サービス名で指定する |
devcontainerとappが別ネットワークで通信できない | devcontainerはbridge だがappがcustom network 使用 |
docker network connect で同じネットワークに所属させる |
hostモードでセキュリティが気になる | ホストと同一のネットワークを使うため、ポートが外部に開く | 通常はbridge で十分。host は開発専用と割り切る |