コンテナ通信の仕組み — localhost・名前・公開ポートを使い分ける
呼ぶ場所が違うと、行き先の書き方も違う
まずは「ブラウザーから」と「別のコンテナから」を分ける
WebアプリとAPIをコンテナで動かすとき、相手の呼び方は、どこからアクセスするかで変わります。LinuxのDockerでユーザー定義bridgeを使う構成を、最初の例にしましょう。
| 呼ぶ側 | この例で使う行き先 | 意味 |
|---|---|---|
| ホストのブラウザー | 127.0.0.1:8080 | ホストへ公開した入口 |
| 同じネットワークのコンテナ | web:80 | 名前で見つけるWebコンテナ |
| Webコンテナの中 | localhost | そのネットワーク名前空間の中 |
ホストの8080番と、コンテナの80番は別です。コンテナのlocalhostが、いつもホストマシンを指すわけではありません。 同じPod内のように名前空間を共有する構成もあるので、どの環境を扱っているかを確認します。
公開ポートの指定を読む
Linuxコンテナを扱うDockerが導入済みで、ホストの8080番が空いている場合の練習例です。既存の同名ネットワークやコンテナがないことを確認してから、自分専用の名前で作ります。
docker network create hiyopen-net
docker run -d --name hiyopen-web \
--network hiyopen-net \
-p 127.0.0.1:8080:80 nginx:stable-alpine
ホストのブラウザーでhttp://127.0.0.1:8080/を開くと、起動したNginxのページへアクセスできます。-pは「ホストのIP:ホストのポート:コンテナのポート」です。ホストIPを省略した公開指定は、既定では全ホストアドレスへ公開され得ます。練習では公開範囲を明示しましょう。
同じユーザー定義bridgeに接続した別のコンテナからなら、名前hiyopen-webで相手を見つけ、コンテナ側の80番へ接続できます。ホストへ公開する8080番は、この内部通信のために必須ではありません。最初の表のwebは説明用の名前で、このコマンドで作る名前はhiyopen-webです。
終わったら、この練習で作ったものだけを片付けます。共有環境のコンテナやネットワークを一括削除するコマンドは使いません。
docker stop hiyopen-web
docker rm hiyopen-web
docker network rm hiyopen-net
これらはローカル練習用の例です。Docker 28より前にはlocalhost公開の到達範囲に既知の注意点があり、経路・Dockerの版・ネットワーク設定も公式資料で確認してください。
もう少し詳しく:仮想の配線をたどる
Linuxのbridge構成では、ネットワーク名前空間でインターフェースや経路を分け、vethペアでホスト側へつなぎます。ホスト側の端点はブリッジへ接続されます。ただしIP設定、経路、ファイアウォールも通信の成立に関わります。
既定bridgeのdocker0と、ユーザー定義bridgeは同じ名前解決ではありません。後者にはコンテナ名などの自動DNSがあり、相手を名前で呼びやすくなります。hostモードではホストのネットワークを共有します。Docker DesktopではLinux環境の層もあるので、図のLinuxホストの構造をそのままWindowsの物理ネットワークと同一視しないでください。
Kubernetesでは、Podが通信の単位になる
同じPod内のコンテナは通常ネットワーク名前空間を共有し、localhostで通信できます。別Pod間は、意図的な分離がない場合、NATなしで通信できるモデルです。Serviceは入れ替わるPodへの安定した接続先を提供します。
CNIは実行基盤とネットワークプラグインのやりとりの仕様で、接続を実現する方式やNetworkPolicyへの対応はプラグインで異なります。VXLANのようにUDPへ包む構成も、ルーティングを使う構成もあります。
CiliumではeBPFによるカーネル内の処理だけでなく、L7機能にEnvoyプロキシも使います。コンテナ通信のすべてが同じ方式・同じ性能になるわけではありません。
覚え方と次の一歩
「コンテナネットワーク」って出てきたら「分けた実行環境をつなぐ、仮想の配線と行き先の設定」と思えばだいたいOK!
通信が届かないときは、呼ぶ側、名前、ポート、公開範囲を順に確認しましょう。Nginx入門やDocker入門と一緒に、最初の1ページを返すところから試せます。
参考資料
- Linux man-pages: veth(4) — 接続されたvethの2端点と、片方downならリンク全体もdownになる条件。
- Docker: Bridge network driver — 同一bridge内の通信、既定docker0とユーザー定義bridgeのDNSの違い。
- Docker: Network drivers — hostによるホストネットワーク共有などドライバごとの条件。
- Docker: Port publishing and mapping — 既定NATでホストTCP8080→コンテナ80、ホストIP省略時の全ホストアドレス公開。
- Docker: Packet filtering and firewalls — Linuxのホスト側ファイアウォール規則、iptablesとnftablesバックエンド。
- Kubernetes: Services, Load Balancing, and Networking — 同じPod内の名前空間共有、意図的分離を除くPod間NATなし、Service/Gateway/Ingress、NetworkPolicy実装条件。
- CNI specification — runtime/plugin間の汎用インターフェース、接続追加ADDと削除DEL。
- Linux kernel: VXLAN — VXLANのUDPトンネルと仮想ネットワーク。
- Cilium: eBPF Introduction — eBPFによるカーネル内L3/L4処理とL7のユーザー空間プロキシへの転送。
- Cilium: Envoy — L7機能を有効にした場合のEnvoy別プロセス/DaemonSetとHTTP等のポリシー処理。
訂正履歴
- 2026-10-05:名前空間の共有と通信条件、公開ポートの範囲を補足し、CiliumのL7処理をカーネル内とした誤りと性能の一般化を修正。