WSL2单机器搭建多节点Docker Swarm测试环境遇网络问题求助
解决WSL2单机器Docker Swarm跨节点服务DNS连接问题
你在WSL2上用两种方式搭建单机器多节点Docker Swarm(多WSL实例/ Docker-in-Docker容器),但当MongoDB和MongoExpress部署在不同节点时,出现MongoNetworkError: failed to connect to server [mongo:27017] on first connect错误。核心问题不是单纯的DNS解析失败,而是Swarm跨节点的Overlay网络连通性配置不到位,以下是针对性解决方案:
一、针对多WSL实例搭建的Swarm集群
1. 统一使用全局Overlay网络
多WSL实例是独立的Docker守护进程,默认的ingress网络是每个实例本地的,跨实例无法互通。需要手动创建全局Overlay网络并绑定服务:
# 在Swarm管理节点创建可挂载的Overlay网络 docker network create --driver overlay --attachable swarm-shared-net
修改部署用的Compose文件,指定使用这个网络:
services: mongo: image: mongo networks: - swarm-shared-net mongo-express: image: mongo-express networks: - swarm-shared-net environment: ME_CONFIG_MONGODB_SERVER: mongo networks: swarm-shared-net: external: true
2. 确保WSL实例间网络互通
- 检查每个WSL实例的IP,确认彼此能ping通:
hostname -I - 关闭WSL实例内的防火墙(或开放Swarm必需端口):
# 测试环境直接关闭防火墙 sudo ufw disable # 或者精准开放端口 sudo ufw allow 2377/tcp sudo ufw allow 7946/tcp sudo ufw allow 7946/udp sudo ufw allow 4789/udp
二、针对Docker-in-Docker(DinD)搭建的Swarm集群
1. 让DinD容器接入Swarm共享网络
启动DinD容器时,直接加入宿主机提前创建的Swarm Overlay网络,避免DinD本地网络隔离:
# 先在宿主机创建共享网络 docker network create --driver overlay --attachable swarm-shared-net # 修改DinD启动命令,加入共享网络 docker run -d --privileged --name worker-1 --hostname=worker-1 --network swarm-shared-net docker:${DOCKER_VERSION}
2. 测试环境可选:禁用DinD网络隔离
如果不需要DinD的网络隔离性,用--net=host启动容器,让DinD内的Docker直接使用宿主机网络,彻底解决跨节点连通问题:
docker run -d --privileged --name worker-1 --hostname=worker-1 --net=host docker:${DOCKER_VERSION}
三、通用排查验证步骤
- 检查节点连通性:在管理节点执行,确认节点IP可达
docker node inspect <节点ID> --format '{{.Status.Addr}}' ping <节点IP> - 验证服务网络配置:查看服务的虚拟IP信息
docker service inspect <服务名> --format '{{.Endpoint.VirtualIPs}}' - 测试DNS解析:在MongoExpress容器内执行,确认能解析
mongodocker exec -it <MongoExpress容器ID> nslookup mongo
内容的提问来源于stack exchange,提问作者Junsong Du
相关产品推荐
相关产品推荐

