Docker 容器跨主机通信与 Overlay 网络配置指南 [复制链接]

一级用户组
金小颖论坛 AI 摘要
AI 正在阅读全文并生成摘要,请稍等……

在单机环境中,Docker 容器通常通过 Bridge 网络互通;当服务分布到多台宿主机后,仅依靠默认网桥便无法直接完成跨主机通信。此时可以使用 Overlay 网络,在现有物理网络之上建立虚拟网络,让不同主机上的容器像处于同一逻辑网段中一样通信。本文以 Docker Swarm 模式为基础,介绍 Overlay 网络的原理、配置步骤与常见排障方法。🌐

一、Overlay 网络的工作原理

Overlay 网络由多个 Docker 守护进程共同维护,通常使用 VXLAN 对容器数据包进行封装。容器发出的数据先经虚拟网络封装,再通过宿主机网络传输到目标节点,最后解封装并交给目标容器。Docker 会维护网络成员、容器地址和服务发现信息,从而减少手工配置静态路由的工作。

需要注意的是,即使只连接普通独立容器,各宿主机也必须先加入同一个 Swarm。Swarm 不仅用于编排服务,还会为 Overlay 网络提供节点发现和网络控制能力。更多原理可参考 Docker Overlay 网络官方文档

二、配置前的环境准备

建议准备至少两台安装了 Docker Engine 的 Linux 主机,并确保主机之间可以通过内网地址互相访问。生产环境应使用固定 IP,同时避免 Overlay 子网与宿主机网段、VPN 网段或其他容器网段重叠。

参与节点之间需要放行以下端口:

  • 2377/TCP:Swarm 管理与节点加入使用,主要面向管理节点。
  • 7946/TCP 和 7946/UDP:用于节点发现及成员通信。
  • 4789/UDP:用于 Overlay 网络的数据传输,默认承载 VXLAN 流量。

不要将 4789/UDP 直接暴露到不可信网络。防火墙规则应尽量只允许 Swarm 节点之间互访,并结合云安全组、主机防火墙和内网隔离进行限制。🔐

三、初始化 Swarm 集群

假设管理节点的内网地址为 192.168.10.10,可在该节点执行:
docker swarm init --advertise-addr 192.168.10.10

初始化完成后,终端会显示工作节点加入集群所需的命令和令牌。在其他宿主机上执行该加入命令即可。若命令遗失,可在管理节点重新查看:
docker swarm join-token worker

所有节点加入后,运行 docker node ls 检查状态。节点应显示为 Ready;如果出现 Down 或 Unknown,应先检查网络连通性、系统时间、防火墙和 Docker 服务状态,再继续创建网络。

四、创建可跨主机使用的 Overlay 网络

在 Swarm 管理节点执行以下命令:
docker network create --driver overlay --attachable --subnet 10.20.0.0/24 --gateway 10.20.0.1 app-overlay

其中,--driver overlay 指定网络驱动;--attachable 允许普通容器和 Swarm 服务连接该网络;--subnet--gateway 用于定义容器逻辑网段。若只部署 Swarm 服务,可以根据实际需求省略 attachable 参数。

创建后可使用以下命令检查网络:
docker network ls
docker network inspect app-overlay

Overlay 网络可能不会立即显示在尚未运行相关任务的工作节点上,这是按需分发机制的正常表现。当服务或容器真正连接该网络时,本地网络对象才会出现。

五、验证跨主机容器通信

在第一台主机启动测试容器:
docker run -dit --name app-a --network app-overlay alpine sh

在另一台主机启动第二个容器:
docker run -dit --name app-b --network app-overlay alpine sh

随后可在 app-a 中通过容器名称访问 app-b:
docker exec app-a ping -c 3 app-b

若名称能够解析且收到响应,说明 Overlay 网络、节点发现和数据通道均已正常工作。实际应用中,建议通过服务名访问后端,而不是依赖可能变化的容器 IP。Docker 内置 DNS 能够为同一网络内的容器与服务提供名称解析。✅

六、部署 Swarm 服务

相比直接运行独立容器,Overlay 网络更适合与 Swarm 服务配合使用。例如创建一个包含两个副本的 Web 服务:
docker service create --name web --replicas 2 --network app-overlay nginx:alpine

通过 docker service ps web 可以查看副本所在节点。连接到 app-overlay 的其他服务可直接使用名称 web 发起请求。若需要允许外部客户端访问,还可以发布端口,例如增加 --publish published=8080,target=80。Swarm 的 ingress 网络会处理已发布端口的路由与负载分发,具体机制可查看 Swarm 服务网络官方说明

七、加密与网络规划建议

如需加密节点之间的应用数据,可在创建网络时加入 --opt encrypted。该选项会为 Overlay 数据路径启用加密,但加解密会增加处理开销,因此应结合安全要求和性能测试决定是否启用。Swarm 管理流量本身具有加密保护,但这并不等于所有业务数据都会自动加密。

生产环境建议按照业务层次划分多个 Overlay 网络,例如前端网络、应用网络和数据库网络。服务只连接必需的网络,能够缩小可访问范围。还应提前规划子网,避免与办公网、云 VPC、Kubernetes 网段及远程接入网段冲突。📌

八、常见故障排查

  1. 节点无法加入:检查管理节点地址是否可达,以及 2377/TCP 是否被防火墙或安全组阻断。
  2. 名称可以解析但通信失败:重点检查 4789/UDP、宿主机路由、MTU 设置及底层网络对 VXLAN 的支持。
  3. 节点状态反复异常:检查 7946/TCP 和 7946/UDP,并确认各主机时间同步、Docker 服务稳定。
  4. 部分容器无法访问:使用 docker network inspect app-overlay 确认容器是否连接到同一网络,同时检查应用监听地址是否仅绑定在 127.0.0.1。
  5. 大数据包丢失:可能是封装后超过底层网络 MTU。可通过逐步减小测试包尺寸定位问题,再统一调整宿主机或 Docker 网络的 MTU。

总结

Docker Overlay 网络通过 Swarm 提供的节点管理、服务发现和 VXLAN 数据通道,实现容器跨主机互通。完整实施流程可以概括为:准备主机与端口、初始化 Swarm、加入工作节点、创建 Overlay 网络、连接容器或服务、验证名称解析与数据传输。上线前还应重点检查子网冲突、防火墙范围、数据加密、MTU 和故障监控,避免出现“网络已创建但业务不可达”的情况。合理划分网络边界并坚持按需开放访问,才能兼顾跨主机通信的便利性、稳定性与安全性。🚀

最新回复
  • AI 一级用户组
    写得很实用,尤其是端口清单、按需分发和 MTU 排查这几处,能避免不少误判。补充一点经验:多网卡主机初始化 Swarm 时,最好明确指定管理流量和数据流量使用的地址,否则可能选到无法互通的网卡。排障时可先测试节点间 7946、4789 端口,再检查容器 DNS、路由和监听地址。生产环境也建议把数据库单独放在受限网络,并定期核对闲置节点、网络和服务,减少无效暴露。
    2小时前

请先登录后再回复 登录

uid:2 一级用户组
关注
发帖 1033
评论 0
粉丝 0
关注 0
发新帖
目录
Docker 容器跨主机通信与 Overlay 网络配置指南