虚拟机、Docker、Overlay 网络模式

📅 发布时间:2026/8/23 8:27:12
虚拟机、Docker、Overlay 网络模式 在运维和开发工作中我们经常同时面对虚拟机和容器两种虚拟化技术它们各自有一套网络模式概念相似但实现差异很大。本文把虚拟机网络、Docker 网络和 Overlay 叠加网络放在一起梳理建立一个完整的认知框架。目录一、虚拟机网络模式1.1 桥接模式Bridged1.2 NAT 模式1.3 仅主机模式Host-Only1.4 内部网络Internal1.5 模式对比二、Docker 网络驱动2.1 bridge默认网络2.2 host2.3 none2.4 container2.5 overlay2.6 macvlan2.7 ipvlan2.8 第三方插件三、Overlay 网络深度解析3.1 核心原理3.2 工作流程3.3 典型应用场景3.4 优缺点3.5 常用排查命令四、总结网络排错一、虚拟机网络模式虚拟机网络由 HypervisorVMware、VirtualBox、KVM提供核心是通过虚拟交换机和地址转换技术让虚拟机与物理网络、虚拟机之间、虚拟机与宿主机之间建立不同程度的连通性。1.1 桥接模式Bridged桥接模式下虚拟机的虚拟网卡直接连接到宿主机的物理网卡所在的局域网。虚拟机会获得一个与宿主机同网段的独立 IP 地址在网络上表现得就像一台独立的物理机。适用场景需要虚拟机被局域网内其他设备直接访问比如搭建测试服务器、运行需要真实 IP 的服务。# 查看网桥 brctl show ip link show br0 # 创建桥接网桥br0 brctl addbr br0 brctl addif br0 eth0 ip link set br0 up1.2 NAT 模式NAT 模式下虚拟机通过宿主机进行网络地址转换来访问外网。虚拟机位于一个私有子网中外网无法直接访问虚拟机除非配置端口转发。适用场景只需要虚拟机上网不关心外部能否主动访问它比如开发环境、临时测试。# iptables端口转发宿主机22222转发到虚拟机192.168.122.100:22 iptables -t nat -A PREROUTING -p tcp --dport 22222 -j DNAT --to 192.168.122.100:221.3 仅主机模式Host-Only仅主机模式创建一个完全隔离的虚拟网络虚拟机只能与宿主机以及同一 Host-Only 网络中的其他虚拟机通信无法访问外网。适用场景搭建本地实验环境、数据库集群、安全隔离的测试网络。1.4 内部网络Internal内部网络比 Host-Only 更彻底虚拟机之间可以互通但连宿主机都无法访问完全封闭。适用场景需要绝对隔离的多节点实验比如模拟一个独立的内网环境。1.5 模式对比模式虚拟机互通访问外网宿主机访问虚拟机外部访问虚拟机桥接是是是是NAT同 NAT 内可通是否需端口转发否Host-Only是否是否Internal是否否否KVM 环境中常用 Linux bridge 或 Open vSwitch 实现桥接生产环境以桥接模式为主。ovs-vsctl show ovs-vsctl add-br ovs-br0二、Docker 网络驱动Docker 的网络由 CNMContainer Network Model模型定义通过不同的网络驱动实现各种网络拓扑。安装 Docker 后默认会创建 bridge、host、none 三个网络。2.1 bridge默认网络bridge 是 Docker 的默认网络驱动基于 Linux bridge 实现。每个容器连接到 docker0 网桥上通过 NAT 访问外网容器之间可以通过 IP 互通。默认 bridge 网络不支持容器名解析生产环境建议创建自定义 bridge 网络这样容器之间可以通过名称互相访问。# 查看docker网络 docker network ls docker network inspect bridge # 创建自定义bridge网络 docker network create -d bridge my-net docker run -d --name web --network my-net nginx # 容器接入已有网络 docker run -it --network my-net --name client busybox # 断开网络 docker network disconnect my-net web2.2 hosthost 模式下容器与宿主机共享网络命名空间容器的网络接口就是宿主机的网络接口端口直接绑定在宿主机上。性能最好但隔离性最差端口冲突风险高。适用于性能敏感的场景比如网络代理、高频通信的服务。docker run -d --network host nginx2.3 nonenone 模式下容器没有网络接口只有 loopback完全隔离。适用于安全要求极高的离线计算、密码学运算等场景。docker run -it --network none busybox2.4 containercontainer 模式让一个容器共享另一个容器的网络命名空间两个容器共享同一个 IP 和端口空间。这是 sidecar 模式的基础比如 Istio 的 Envoy 代理就是通过这种方式与业务容器共享网络。docker run -d --name app-nginx nginx # 共享app‑nginx网络栈 docker run -it --network container:app-nginx busybox2.5 overlayoverlay 用于跨主机的容器通信基于 VXLAN 隧道技术是 Docker Swarm 的默认网络方案。详见本文第三节。2.6 macvlanmacvlan 让每个容器拥有独立的 MAC 地址像物理机一样直接接入局域网。适用于遗留应用需要真实二层网络、或者需要与物理网络设备直接通信的场景。# macvlan创建 docker network create -d macvlan \ --subnet10.20.10.0/24 \ --gateway10.20.10.1 \ -o parenteth0 macvlan-net2.7 ipvlanipvlan 与 macvlan 类似但所有容器共享同一个 MAC 地址通过 IP 地址区分。分为 L2 模式和 L3 模式L3 模式更像路由器适合大规模部署。docker network create -d ipvlan \ --subnet10.20.20.0/24 \ -o parenteth0 ipvlan-net2.8 第三方插件Calico、Flannel、Weave 等 CNI 插件提供了更丰富的网络策略和跨主机通信能力主要用于 Kubernetes 集群。# k8s查看cni网络 kubectl get networkpolicy kubectl describe pod xxx | grep Network三、Overlay 网络深度解析Overlay叠加网络是在物理网络之上构建的虚拟网络通过隧道封装让跨主机的容器或虚拟机像在同一个局域网中通信。它是容器编排和云网络的基石。3.1 核心原理物理网络称为 Underlay虚拟网络称为 Overlay。Overlay 网络的数据包在发送时被封装成 Underlay 网络的数据包到达目标节点后解封装再转发给目标容器。最常用的封装协议是 VXLAN把原始以太网帧封装进 UDP 包默认端口 4789用 24 位的 VNIVXLAN Network Identifier标识不同的虚拟网络理论上支持 1600 万个网段。3.2 工作流程以 Docker Swarm 为例1. 节点加入 Swarm 集群后各节点之间建立 VXLAN 隧道2. 容器分配到 overlay 子网的 IP 地址3. 跨节点通信时源节点把容器发出的数据包封装成 VXLAN UDP 包通过物理网络发给目标节点4. 目标节点解封装将原始数据包转发给本地的目标容器整个过程对容器完全透明容器感知不到物理网络的存在。3.3 典型应用场景场景实现方式Docker Swarmdocker network create -d overlayKubernetesFlannelVXLAN、CalicoIPIP、CiliumVXLAN/GeneveOpenStack NeutronVXLAN / GRE 构建租户隔离网络公有云 VPC本质就是 Overlay 网络# swarm初始化 docker swarm init # 创建overlay网络 docker network create -d overlay overlay-cluster # 服务使用overlay网络 docker service create --name demo --network overlay-cluster nginx3.4 优缺点优点• 跨主机二层连通容器可直接互访• 网络隔离不同 Overlay 子网互不干扰• 与物理网络解耦无需改动交换机配置缺点• 封装带来额外开销MTU 需要调小通常 1450 左右• 性能略低于 Underlay 网络• 排错复杂需要同时分析 Underlay 和 Overlay 两层3.5 常用排查命令# 查看 Docker overlay 网络 docker network ls docker network inspect overlay-net # 查看 VXLAN 接口 ip -d link show | grep -A2 vxlan # 抓包查看 VXLAN 封装 tcpdump -i any port 4789 # 查看vxlan vni ip -d link show vxlan0 # 查看容器真实网络命名空间 ls /var/run/docker/netns ip netns exec netns-id ip a四、总结虚拟机网络和容器网络虽然概念相似但设计目标不同虚拟机网络强调与物理网络的兼容和隔离容器网络强调轻量、灵活和跨主机编排。Overlay 网络则是连接两者的关键技术让分布式系统中的工作负载可以跨越物理边界自由通信。在实际工作中单机环境用 bridge 或 NAT 即可多机容器编排需要 Overlay生产级 Kubernetes 集群则通常使用 Calico 或 Cilium 等成熟的 CNI 方案。理解这些网络模式的底层原理是排查网络故障和设计网络架构的基础。网络排错# 路由查看 ip route # iptables nat查看 iptables -t nat -nvL # mtu检查 ip link show ping -M do -s 1420 目标IP