核心是搭建Swarm集群并创建Overlay网络:先开放2377/7946/4789端口,执行docker swarm init初始化集群并加入节点,再用docker network create -d overlay --attachable创建网络,最后通过service部署容器并用服务名ping验证互通。

要在Docker中用Overlay网络实现跨主机容器互通,核心是搭建一个支持服务发现的Swarm集群,并在该集群内创建Overlay网络。它不是单机配置,而是一套协同机制——依赖Swarm Mode管理节点、VXLAN封装数据、注册中心(如内置的Gossip协议或外部etcd/Consul)同步网络状态。
前提:初始化Swarm集群并确保节点就绪
Overlay网络必须运行在Swarm模式下。任意一台宿主机执行初始化命令,其他节点以Worker或Manager身份加入:
- 在主节点运行:docker swarm init --advertise-addr (例如
192.168.56.10) - 复制输出的
docker swarm join命令,在其他宿主机上执行,完成节点加入 - 确认节点状态:docker node ls,所有节点应显示
Ready且角色为worker或manager - 确保各宿主机间TCP端口2377(集群管理)、7946(节点通信)、4789(VXLAN数据)开放,防火墙需放行
创建Overlay网络并验证作用域
Overlay网络需显式创建,且默认为集群范围(swarm-scoped),不能用于独立容器(standalone container):
- 执行:docker network create -d overlay --attachable mynet
其中--attachable参数允许非Swarm服务(如普通docker run容器)接入,便于测试;若只部署Service,可省略 - 查看网络:docker network ls,确认
mynet类型为overlay,驱动为overlay - 该网络自动同步到所有Swarm节点,无需在每台机器单独创建
部署容器并测试跨主机通信
容器必须连接到同一Overlay网络才能互通,推荐使用Service方式部署(原生支持DNS服务发现):
- 启动两个跨主机的服务:
docker service create --name alpine1 --network mynet --replicas 1 alpine:latest sleep 3600
docker service create --name alpine2 --network mynet --replicas 1 alpine:latest sleep 3600 - 获取任一服务的任务容器ID:docker service ps alpine1,再进容器:docker exec -it
sh - 在容器内直接ping服务名:ping alpine2(Swarm内置DNS会自动解析为对应容器IP)
- 也可用
dig tasks.alpine2查到所有副本IP,验证负载均衡与多实例可达性
关键细节与常见问题
Overlay依赖底层连通性和配置细节,忽略易导致“创建成功但无法通信”:
- VXLAN使用UDP端口4789,宿主机间必须能互相UDP通信;建议用
nc -u测试连通性4789 - Docker daemon启动时需指定
--cluster-store和--cluster-advertise(旧版需);Docker 1.12+ Swarm Mode已内置Gossip,通常无需额外配置注册中心 - 容器默认不能通过宿主机IP访问Overlay网络中的服务;如需外部访问,应使用
publish端口或配合Ingress网络 - 若使用
docker run --network mynet方式启动容器,需确保该容器所在节点已加入Swarm,且网络带--attachable标志











