同一局域网下Windows与Ubuntu主机Docker容器跨主机通信咨询
overlay网络报错原因排查
- 未正确配置Docker Swarm集群:overlay网络依赖Swarm集群实现跨节点通信,你遇到的超时错误90%以上是节点间通信链路异常导致
- 所需端口未放行:Swarm集群要求2377/tcp(集群管理)、7946/tcp/udp(节点发现)、4789/udp(overlay流量)三个端口在两台主机的防火墙(Ubuntu的ufw、Windows的Defender防火墙)都正常放行,端口拦截会直接触发超时报错
- Windows Docker Desktop网络适配问题:如果用WSL2后端,默认NAT模式下Ubuntu主机无法直接访问Windows Docker节点的虚拟IP,会导致Swarm节点加群失败
可行解决方案
方案1:端口映射方案(最适合当前需求,无需改造网络)
仅需要Adminer连接MariaDB的场景下,直接用主机端口映射即可实现互通,无需配置复杂的跨主机容器网络:
- 启动Ubuntu端的MariaDB容器时,将3306端口绑定到Ubuntu主机的局域网IP,不要仅绑定127.0.0.1:
docker run -d -p 192.168.x.xxx:3306:3306 --name mariadb -e MARIADB_ROOT_PASSWORD=你的密码 mariadb:latest
请将192.168.x.xxx替换为Ubuntu主机的静态局域网IP - Ubuntu端放行3306端口:
ufw allow 3306/tcp - 启动Windows端的Adminer容器时,直接填写Ubuntu主机的局域网IP+3306作为数据库地址即可正常连通
方案2:修复overlay网络实现全容器互通
如果需要多容器跨主机普遍互通,按以下步骤修复配置:
- 提前固定两台主机的局域网静态IP,避免IP变动导致集群失效
- 两台主机放行Swarm所需端口:
- Ubuntu端执行:
ufw allow 2377/tcp ufw allow 7946/tcp ufw allow 7946/udp ufw allow 4789/udp ufw reload - Windows端打开Defender防火墙高级设置,添加入站规则放行上述三个端口的TCP/UDP协议
- Ubuntu端执行:
- 初始化Swarm集群(以Ubuntu作为管理节点):
Ubuntu端执行docker swarm init --advertise-addr 192.168.x.xxx,替换为Ubuntu的局域网IP,执行完成后复制输出的节点加入命令 - Windows节点加入集群:
打开Windows PowerShell(WSL2后端需要先在WSL终端执行一次),粘贴刚才复制的加入命令执行,提示This node joined a swarm as a worker即为成功 - 创建可接入的overlay网络:
Ubuntu端执行docker network create --driver overlay --attachable cross-host-net,--attachable参数允许普通容器(非Swarm服务容器)接入该网络 - 启动容器时指定接入该网络即可:
- 启动MariaDB时添加
--network cross-host-net参数 - 启动Adminer时也添加
--network cross-host-net参数,后续直接用MariaDB的容器名作为数据库地址即可连通
- 启动MariaDB时添加
内容的提问来源于stack exchange,提问作者aicatsana
相关产品推荐
相关产品推荐

