必须用swarm模式启用内置overlay网络:先确保各节点docker版本一致、时间同步并开放2377/7946/4789端口,再执行docker swarm init初始化集群、docker swarm join加入节点,接着在manager上运行docker network create -d overlay --attachable创建网络,最后通过docker service create部署服务并用ping和wget验证跨主机互通。

要让 Docker 容器在多台主机间原生互联,必须用 Swarm 模式启用内置 Overlay 网络——它不依赖外部 KV 存储(如 etcd 或 Consul),从 Docker 1.12 起已深度集成,是当前最简、最稳的生产级方案。
准备集群基础环境
确保所有节点满足以下硬性条件:
- 运行相同大版本的 Docker(推荐 20.10 或更新版),小版本差异可能导致网络同步失败
- 各主机时间严格同步(建议用 chrony 或 systemd-timesyncd)
- 开放三个关键端口:TCP 2377(Swarm 管理通信)、TCP/UDP 7946(节点发现与控制面)、UDP 4789(VXLAN 封装数据平面)
- Ubuntu 示例:sudo ufw allow 2377/tcp && sudo ufw allow 7946 && sudo ufw allow 4789/udp
初始化并加入 Swarm 集群
在首台主机(将作为 manager)执行:
docker swarm init --advertise-addr 192.168.1.10(替换为本机可被其他节点访问的真实 IP)
命令输出中会给出完整 join 命令,形如:
docker swarm join --token SWMTKN-xxx 192.168.1.10:2377
在其余主机上直接运行该命令。完成后,在任意 manager 上执行 docker node ls,确认所有节点状态为 Ready 且角色正确(worker / manager)。
创建可调试的跨主机 Overlay 网络
仅需在任一 manager 节点执行:
docker network create -d overlay --attachable my-net
关键点说明:
-
--attachable 是必备参数:它允许非 service 的独立容器(比如临时调试容器)接入该网络,否则只有
docker service create启动的服务才能使用 - 该网络自动广播至所有集群节点,无需手动同步或重复创建
- 不指定子网时,Docker 自动分配 10.0.0.0/24 或类似地址段;如需固定,可加
--subnet=10.11.0.0/16 --gateway=10.11.0.1
部署服务并验证原生互通
启动两个服务,强制调度到不同主机(可用 --constraint node.hostname==xxx 控制):
docker service create --name web --network my-net -p 8080:80 nginx
docker service create --name client --network my-net alpine sleep 3600
获取 client 任务容器 ID:
docker ps --filter "ancestor=alpine" --format "{{.ID}}"
进入容器并测试:
docker exec -it
若返回 Nginx 欢迎页 HTML,说明 DNS 解析、L3 路由、VXLAN 封装解封全部通透——这就是 Docker 原生 Overlay 的真实互联效果。











