Docker 中的 overlay 网络模式如何配置?

Docker 中的 overlay 网络模式如何配置? Docker 的Overlay 网络模式是专为Docker Swarm 集群设计的跨主机网络解决方案。它允许不同宿主机上的容器通过一个虚拟的 Layer 2 网络直接通信仿佛它们连接在同一个物理交换机上。Overlay 网络基于VXLAN (Virtual Extensible LAN)技术通过封装数据包在现有网络Underlay Network上传输屏蔽了底层网络的复杂性。一、核心原理与前提1. 工作原理VXLAN 封装容器发出的数据包被封装在 UDP 包中默认端口 4789通过物理网络传输到目标主机解封装后送达目标容器。Key-Value StoreOverlay 网络依赖分布式键值存储如 Consul, Etcd, 或 Docker 内置的 Raft来维护网络状态和 IP 分配。在 Swarm 模式下Docker 内置的 Raft 自动处理此功能。加密支持 IPsec 加密需手动配置。2. 前提条件必须使用 Docker Swarm 集群Overlay 网络只能在 Swarm 模式下创建和使用单节点 Docker 无法创建 Overlay 网络。网络连通性所有节点Manager 和 Worker之间必须能互相访问以下端口2377(集群管理)7946(TCP/UDP节点通信)4789(UDPVXLAN 数据流量)防火墙配置确保上述端口未被防火墙拦截。二、配置步骤1. 初始化 Swarm 集群如果尚未初始化在 Manager 节点执行dockerswarm init --advertise-addrMANAGER_IP在其他节点加入集群使用生成的 token。2. 创建 Overlay 网络在任意 Manager 节点执行dockernetwork create-doverlay my-overlay-net-d overlay: 指定驱动为 Overlay。my-overlay-net: 网络名称。可选参数# 创建支持 IPv6 的 Overlay 网络dockernetwork create-doverlay--ipv6my-overlay-net# 创建带子网的 Overlay 网络推荐便于管理dockernetwork create-doverlay--subnet10.0.9.0/24 my-overlay-net# 创建加密的 Overlay 网络 (IPsec)dockernetwork create-doverlay--optencrypted my-overlay-net3. 验证网络创建dockernetworkls# 输出应包含 my-overlay-net驱动为 overlay三、部署服务并使用 Overlay 网络1. 启动服务并连接网络创建两个服务分别运行在不同节点上通过 Overlay 网络通信。服务 A (Web):dockerservicecreate\--nameweb\--networkmy-overlay-net\--replicas2\nginx:alpine服务 B (App):dockerservicecreate\--nameapp\--networkmy-overlay-net\--replicas2\alpinepingweb注意在 Swarm 模式下服务名web会自动被 DNS 解析为服务对应的虚拟 IP 或容器 IP。2. 验证跨主机通信如果web和app运行在不同节点它们依然可以通过ping web或curl web互相访问。Overlay 网络自动处理了底层的 VXLAN 封装和解封装。# 进入 app 容器dockerservicelogs app# 或者dockerexec-itapp_container_idshpingweb四、高级配置1. 多子网支持一个 Overlay 网络可以支持多个子网需 Docker 版本 17.06dockernetwork create-doverlay\--subnet10.0.9.0/24\--subnet10.0.10.0/24\my-multi-subnet2. 驱动选项 (Driver Options)com.docker.network.driver.overlay.vxlan: 自定义 VXLAN 参数高级。encrypted: 启用 IPsec 加密需安装libreswan或strongswan等依赖且性能有损耗。dockernetwork create-doverlay--optencrypted secure-net3. 连接现有服务如果服务已创建但未连接网络dockernetwork connect my-overlay-net existing-service4. 断开连接dockernetwork disconnect my-overlay-net existing-service五、Overlay 网络 vs Bridge 网络特性Bridge (默认)Overlay (Swarm)适用范围单台宿主机跨多台宿主机 (Swarm 集群)底层技术Linux Bridge iptablesVXLAN GENEVE服务发现需自定义网络或 DNS内置 DNS支持服务名解析端口映射需手动-p自动通过 Ingress 或--publish加密不支持支持 (IPsec)依赖无必须运行在 Swarm 模式六、常见问题排查1. 端口 4789 被防火墙拦截现象容器无法跨主机通信日志显示network not found或连接超时。解决# 检查防火墙状态sudoufw status# 开放 UDP 4789sudoufw allow4789/udp# 或者使用 firewalldsudofirewall-cmd --add-port4789/udp--permanentsudofirewall-cmd--reload2. 节点间时间不同步现象VXLAN 隧道建立失败日志报错。解决确保所有节点 NTP 时间同步。sudontpdate-stime.nist.gov3. 服务无法解析域名现象ping service-name失败。解决确认服务已连接到同一个 Overlay 网络。检查服务名是否包含特殊字符建议只使用小写字母、数字和连字符。在 Swarm 模式下DNS 解析是自动的无需额外配置。4. 性能问题现象跨主机网络延迟高或吞吐量低。原因VXLAN 封装增加了 CPU 开销。优化确保物理网络带宽充足建议万兆网络。启用硬件卸载如果网卡支持 VXLAN offload。避免在 Overlay 网络上传输大量小数据包。七、最佳实践始终使用 Swarm 模式Overlay 网络是 Swarm 的核心特性不要尝试在单节点 Docker 中强行使用。网络隔离为不同业务创建不同的 Overlay 网络如frontend-net,backend-net实现逻辑隔离。监控网络流量使用docker network inspect或第三方工具监控 VXLAN 流量。定期清理删除未使用的 Overlay 网络以释放资源。dockernetwork prune安全加固限制 Overlay 网络端口4789仅允许集群节点访问。在敏感环境中启用--opt encrypted。八、示例完整部署流程# 1. 初始化 Swarm (Manager)dockerswarm init --advertise-addr192.168.1.10# 2. 添加 Worker (在 Worker 节点)dockerswarmjoin--tokenTOKEN192.168.1.10:2377# 3. 创建 Overlay 网络dockernetwork create-doverlay app-net# 4. 部署数据库服务 (Worker 1)dockerservicecreate--namedb--networkapp-net--replicas1mysql:5.7# 5. 部署应用服务 (Worker 2)dockerservicecreate--nameapi--networkapp-net--replicas2my-api-image# 6. 验证通信dockerservicelogs api# 应看到 api 成功连接 db