在日常开发与部署过程中,很多人一开始都会有这样的疑惑:
- 容器之间是怎么通信的?
- 容器怎么访问宿主机?宿主机又如何访问容器?
- Kubernetes 中 Pod 的网络和 Docker 容器一样吗?
- 容器跨机器是怎么连通的?是用了物理网络还是隧道?
这些问题都指向一个核心话题:容器网络的通信机制。本篇将用通俗易懂但技术精准的方式,全面梳理容器、Pod、虚拟机与宿主机之间的网络交互原理,涵盖 Docker 和 Kubernetes 两大场景。
一、容器网络基础:veth、bridge、NAT 是关键
1. veth pair:容器网络的桥梁
当你运行一个容器时,Docker 会创建一对虚拟以太网接口(veth pair):
- 一端连接到容器内部,作为容器的 eth0;
- 另一端连接到宿主机的桥接网卡(如 docker0)。
这就好比用一根网线把容器和宿主机的虚拟交换机连起来。
2. bridge:Docker 默认网络
Docker 默认会创建一个叫 docker0 的 Linux 网桥(bridge),作用如下:
- 给每个容器分配一个私有 IP(通常是 172.17.0.X 段);
- 容器通过该桥接设备与宿主机通信;
- 同一 bridge 网络下的容器可以直接互通。
3. NAT:容器访问外网的跳板
容器虽然拥有自己的私有 IP,但要访问外网,还需要宿主机做 NAT 转换(SNAT):
[容器 172.17.0.2] → [docker0] → [宿主机公网网卡] → Internet
宿主机通过 iptables 做地址伪装,实现容器出网访问功能。
二、容器与宿主机的通信模型详解
1. 宿主机访问容器
方式一:容器私有 IP(仅限 bridge 内)
curl http://172.17.0.2:80
要求容器和宿主机在同一个网络命名空间下,且未开启防火墙限制。
方式二:端口映射(推荐方式)
docker run -p 8080:80 nginx
此时访问宿主机的 localhost:8080,就等同于访问容器内的 80 端口。
2. 容器访问宿主机
容器内访问宿主机方式:
- 使用默认网关 IP:在容器内查看 ip route,默认网关即为宿主机地址;
- Docker for Mac/Win 专用地址:host.docker.internal 是官方内置别名。
三、容器与容器之间通信
1. 同宿主机,默认网络
两个容器都连接在 docker0 桥接网络时,它们的 IP 是同一子网,可以互通:
docker network inspect bridge
也可以通过容器名称通信(如果在用户自定义网络下):
docker network create my-net
docker run --network my-net --name web nginx
docker run --network my-net busybox ping web
2. 跨宿主机通信 —— Overlay 网络
当容器部署在不同宿主机上(如 Swarm 或 Kubernetes 集群中),就必须使用 Overlay 网络:
- 原理:将容器的网络包通过 VXLAN、IPIP 或 eBPF 封装为宿主机级别通信;
- 主流方案:
- Docker Swarm Overlay
- Flannel(VXLAN、UDP)
- Calico(基于 BGP 路由)
- Cilium(eBPF + L7 安全)
网络通信流程图:
[容器A] --veth--> [Bridge A] --Overlay--> [Bridge B] <--veth-- [容器B]
四、Pod 网络模型与容器的不同点
1. 什么是 Pod?
在 Kubernetes 中,Pod 是最小的调度单元,一个 Pod 可以包含多个容器,这些容器共享:
- 同一网络命名空间(network namespace)
- 同一 IP 地址、端口空间
也就是说,Pod 内容器可以通过 localhost 互相访问!
2. Pod 与容器的网络区别
特性 | Docker 容器 | K8s Pod |
---|---|---|
网络 IP | 容器私有 IP | Pod 拥有独立 IP |
容器间通信 | 默认不同网段不可通 | Pod 内可通过 localhost |
默认网络 | bridge | CNI 插件统一管理 |
跨宿主机通信 | 手动配置 Overlay | 自动使用 CNI Overlay |
五、虚拟机与容器之间的网络交互
当你将容器部署在虚拟机上(比如公有云的 ECS、私有云的 KVM、VMware),通信路径如下:
1. 虚拟机访问容器
- 通过虚拟机的宿主网络访问 Docker 端口映射;
- 若容器未映射端口,需要登录虚拟机内部使用容器 IP 访问。
2. 容器访问虚拟机外部服务
容器 → 虚拟机出口 NAT → 外部网络。
注意:如果使用云厂商的安全组、VPC 网络,还需配置相应规则开放端口。
六、容器网络常见的 7 种类型(Docker)
Docker 实际支持以下 7 种网络类型(截至 Docker v24):
网络类型 | 说明 |
---|---|
bridge | 默认网络类型,容器通过虚拟桥接互联 |
host | 容器与宿主机共用网络命名空间 |
none | 完全禁用网络 |
container: | 多容器共享一个容器的网络空间(如 Pod 模式) |
overlay | 跨宿主机网络(Swarm 模式) |
macvlan | 容器像真实物理设备一样拥有独立 MAC 地址,接入物理网段 |
ipvlan | 类似 macvlan,但不生成 MAC,适合高性能网络场景 |
七、实战建议:选哪种网络模式?
场景 | 推荐网络模式 |
---|---|
单机本地测试 | bridge |
网络性能优先,无隔离需求 | host |
容器模拟独立主机部署 | macvlan |
跨宿主机部署集群 | overlay(K8s/Swarm) |
云上部署容器 | 通常由 CNI 自动配置(Flannel/Calico) |
八、总结
容器网络虽然看似复杂,但只要理解了 Linux 网络命名空间、veth pair、桥接和 NAT 的基础概念,就能把握大部分网络模型的核心原理。在 Kubernetes 中,Pod 的引入进一步简化了应用层对网络的认知,实现了平台级统一抽象。
掌握容器网络,不只是让你能“跑起来”,更是成为云原生时代合格架构师的必经之路。