容器网络模式#
一句话答案#
Docker 网络模式:bridge(默认虚拟网桥)、host(共享宿主网络)、overlay(跨主机 VXLAN),K8s 用 CNI 插件管理。
核心要点
| 模式 | 特点 | 适用 |
|---|---|---|
| bridge | 虚拟网桥+NAT | 单机容器互通 |
| host | 共享宿主机网络 | 高性能 |
| none | 无网络 | 安全隔离 |
| overlay | VXLAN 跨主机 | K8s 集群 |
K8s CNI: Calico(BGP路由)/ Flannel(VXLAN覆盖)/ Cilium(eBPF)
单机互通:veth pair + bridge#
veth pair 是一对”虚拟网线”,一端插容器 netns(容器内 eth0),一端插宿主 docker0 网桥;从一端进的包必从另一端出。docker0 是二层虚拟网桥,同主机容器挂在同一网桥上即可二层互通;容器出公网时经 MASQUERADE(SNAT)把容器 IP 换成宿主 IP。
跨主机方案一:Overlay / VXLAN 封装#
问题: 容器网段在不同主机上,底层物理网络不认识容器 IP,二层不通。
VXLAN 解法(“二层帧塞进 UDP”): 把整个容器二层以太帧作为载荷,外面套上 VXLAN 头(含 VNI,标识虚拟网络)+ UDP 头(目的端口 8472) + 外层 IP/MAC(源/目的是两台宿主机)。
[外层 MAC|外层 IP(宿主↔宿主)|UDP:8472|VXLAN(VNI)| 原始容器以太帧(含容器 IP) ]plaintextVTEP(VXLAN 隧道端点,如 Flannel 的 flannel.1 设备)负责封装/解封:发送端查目标容器在哪台宿主,封包发往对端宿主;对端 VTEP 拆掉外层还原原始帧交给目标容器。代价是多一层封装开销(MTU 变小、CPU 封解包)。
跨主机方案二:路由 / Calico BGP#
思路: 不封装,让物理网络直接路由容器 IP。Calico 在每台节点跑 BIRD,通过 BGP 协议把”本节点上每个 Pod 的 /32 主机路由”(精确到单个 IP)通告给其他节点/路由器。这样发往某 Pod IP 的包,宿主路由表直接知道下一跳是哪台节点,纯三层转发、无封装开销、性能接近原生;缺点是要求底层网络支持 BGP(或用 IPIP/VXLAN 做 overlay 兜底跨子网场景)。
面试回答(2分钟版)
Docker容器网络有几种主要模式。默认是bridge模式,Docker会创建一个虚拟网桥docker0,每个容器分配一个虚拟网卡连到网桥上,容器间通过网桥通信,对外通过NAT转换访问宿主机网络,适合单机多容器场景。host模式让容器直接使用宿主机的网络栈,没有网络隔离但性能最好,缺点是端口可能冲突。none模式完全没有网络,用于安全隔离场景。overlay模式通过VXLAN隧道实现跨主机容器通信,是Docker Swarm和K8s集群网络的基础。到了K8s层面,网络由CNI插件管理,主流三个:Calico基于BGP路由协议,性能好且支持网络策略;Flannel用VXLAN覆盖网络,简单易用;Cilium基于eBPF技术,在内核层面处理网络包,性能更强且支持更细粒度的安全策略。选型上小集群用Flannel,生产环境推荐Calico或Cilium。
追问与易错
追问方向:
- “Calico 和 Flannel 怎么选?”→ Flannel 简单易用适合小集群,但不支持 NetworkPolicy;Calico 基于 BGP 路由性能更好且支持网络策略,生产环境推荐 Calico 或 Cilium
- “容器跨主机通信怎么实现的?”→ Overlay 方案(Flannel VXLAN)将容器网络包封装在宿主机 UDP/IP 包中隧道传输;路由方案(Calico BGP)直接在宿主机路由表中添加容器网段路由,性能更好但要求网络基础设施支持
- “Pod 网络不通怎么排查?”→ 从后往前查:先 ping Pod IP 看网络层连通性,再查 Service/endpoints 是否正确,然后查 NetworkPolicy 是否阻止流量,最后查 CNI 插件日志和节点 iptables 规则
易错点:
- ❌ 说不清 VXLAN 在封装什么——封的是整个容器二层以太帧,外面套 VNI+UDP(8472)+ 宿主机 IP,所以叫”二层帧塞进 UDP”
- ❌ 把 Calico 也当成隧道封装——Calico BGP 是纯三层路由(通告 /32 主机路由),不封包,性能优于 VXLAN
- ❌ 忽略 MTU 问题——Overlay 封装额外占用约 50 字节,容器 MTU 需调小,否则大包分片或丢包