Docker 跨主机网络实战:基于 VXLAN 打通 2 节点容器通信(附 5 步配置)

发布时间:2026/7/8 15:26:15
Docker 跨主机网络实战:基于 VXLAN 打通 2 节点容器通信(附 5 步配置) Docker 跨主机网络实战基于 VXLAN 打通双节点容器通信在分布式应用架构中容器跨主机通信是构建弹性服务的关键能力。传统基于路由的方案往往受限于网络拓扑而 VXLANVirtual Extensible LAN技术通过二层隧道实现了虚拟网络的灵活扩展。本文将手把手带您完成两个 Docker 主机间基于 VXLAN 的二层网络互通实战涵盖从原理到生产级配置的全流程。1. 环境准备与基础概念1.1 实验环境要求本次实验需要满足以下基础条件两台运行 Linux 的物理机或虚拟机推荐 Ubuntu 20.04主机间网络可达建议使用相同子网已安装 Docker 引擎版本 20.10.0具备 root 或 sudo 权限网络拓扑示意---------------- ---------------- | Host1 | | Host2 | | 172.20.160.13 |-----| 172.20.161.221 | | ContainerA | | ContainerB | ---------------- ----------------1.2 VXLAN 核心组件理解以下关键概念对后续配置至关重要组件作用描述VTEP隧道端点设备负责 VXLAN 报文的封装/解封装VNI24位的网络标识符类似 VLAN ID 但支持更大地址空间16MUnderlay 网络承载 VXLAN 流量的物理网络本文为主机间 IP 网络Overlay 网络建立在 Underlay 之上的虚拟二层网络技术提示VXLAN 默认使用 UDP 4789 端口部分云平台可能需要放行该端口2. 基础网络配置2.1 主机网络检查首先确认两台主机的基础连通性# 在 Host1 执行 ping 172.20.161.221 -c 3 # 在 Host2 执行 ping 172.20.160.13 -c 3若出现丢包需先解决底层网络问题。2.2 创建自定义 Docker 网络为避免与默认 docker0 网络冲突我们为容器创建独立子网# 在 Host1 和 Host2 分别执行 docker network create --subnet 172.18.0.0/16 vxlan-net验证网络创建docker network ls | grep vxlan-net3. VXLAN 隧道建立3.1 手动配置 VTEP在 Host1 上创建 VXLAN 接口ip link add vxlan-docker type vxlan \ id 100 \ dstport 4789 \ remote 172.20.161.221 \ local 172.20.160.13 \ dev eth0 ip addr add 10.1.1.1/24 dev vxlan-docker ip link set vxlan-docker up在 Host2 上创建对端配置ip link add vxlan-docker type vxlan \ id 100 \ dstport 4789 \ remote 172.20.160.13 \ local 172.20.161.221 \ dev eth0 ip addr add 10.1.1.2/24 dev vxlan-docker ip link set vxlan-docker up3.2 验证隧道连通性在 Host1 上测试ping 10.1.1.2 -c 3成功输出应类似PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data. 64 bytes from 10.1.1.2: icmp_seq1 ttl64 time1.23 ms ...4. 容器网络接入4.1 启动测试容器在 Host1 启动容器并指定静态 IPdocker run -itd --name containerA \ --network vxlan-net \ --ip 172.18.0.11 \ alpine sleep 3600在 Host2 启动对端容器docker run -itd --name containerB \ --network vxlan-net \ --ip 172.18.0.12 \ alpine sleep 36004.2 将 VXLAN 接口接入 Docker 网桥首先获取网桥名称# 在 Host1 和 Host2 上分别执行 brctl show | grep vxlan-net输出示例br-2a4d5e8f3a45 8000.0242b1a5c3c6 no veth3a7f5e2将 VXLAN 接口接入网桥# Host1 执行 brctl addif br-2a4d5e8f3a45 vxlan-docker # Host2 执行 brctl addif br-2a4d5e8f3a45 vxlan-docker5. 连通性验证与排错5.1 容器间通信测试在 Host1 的容器中测试docker exec -it containerA ping 172.18.0.12 -c 3成功输出示例PING 172.18.0.12 (172.18.0.12): 56 data bytes 64 bytes from 172.18.0.12: seq0 ttl64 time1.841 ms ...5.2 常见问题排查若出现通信失败按以下步骤检查检查 FDB 表项bridge fdb show dev vxlan-docker正常应显示对端 VTEP 的 MAC 和 IP 映射验证 VXLAN 接口状态ip -d link show vxlan-docker确认输出中包含vxlan id 100 remote 172.20.161.221等配置抓包分析tcpdump -i eth0 udp port 4789 -vv应能看到封装后的 VXLAN 报文6. 生产环境优化建议6.1 性能调优参数在创建 VXLAN 接口时可添加以下优化参数ip link add vxlan-docker type vxlan \ id 100 \ dstport 4789 \ remote 172.20.161.221 \ local 172.20.160.13 \ dev eth0 \ ttl 64 \ tos 0x28 \ ageing 300 \ maxaddress 500006.2 高可用方案建议在生产环境实施多播替代单播配置适用于多节点场景结合 BGP EVPN 实现动态路由学习使用 Docker Overlay 网络实现自动化管理7. 进阶配置多节点扩展对于超过两个节点的场景可通过以下命令创建多播模式的 VXLANip link add vxlan-mcast type vxlan \ id 200 \ dstport 4789 \ group 239.1.1.1 \ dev eth0 \ ttl 5注意需确保网络设备支持 IGMP 并正确配置多播路由通过本文的实践您已经掌握了基于原始 Linux 命令构建跨主机容器网络的核心方法。这种方案虽然需要手动配置但提供了对网络栈的完全控制权适合需要深度定制网络策略的场景。