Win11下Docker Swarm端口7946/4789未发布及远程容器配置求助
Docker Swarm测试环境搭建与Visual Studio远程容器开发问题
问题背景
在Windows 11本地主机搭建Docker Swarm测试环境用于Visual Studio容器开发时,遇到以下问题:
- Docker服务仅监听隔离网络
192.168.65.0/24,Swarm相关端口未发布到主机,导致跨节点通信异常 - 尝试过的方案均无效:
- 启用镜像网络将docker-desktop WSL2 IP设为主机IP,但服务及
network=host容器仍使用隔离网络 - 用relay容器转发Swarm端口(配置如下),但NAT改写源IP,无法接收其他节点入站流量
- 启用
Enable host networking后源IP被转为127.0.0.1,问题未解决 - 透明网络仅支持Windows容器,不适用
- 无Docker Desktop的WSL2镜像网络方案因Visual Studio依赖Docker Desktop不可行
- 启用镜像网络将docker-desktop WSL2 IP设为主机IP,但服务及
relay容器配置:
services: relay: image: trajano/multisocat container_name: relay user: root ports: - "12377:2377" - "17946:7946" - "17946:7946/udp" - "14789:4789/udp" environment: SOCAT_MANAGER: "TCP-LISTEN:2377,fork TCP:172.17.0.1:2377" SOCAT_DISCOVERY_TCP: "TCP-LISTEN:7946,fork TCP:172.17.0.1:7946" SOCAT_DISCOVERY_UDP: "UDP4-RECVFROM:7946,fork UDP4-SENDTO:172.17.0.1:7946" SOCAT_OVERLAY: "UDP4-RECVFROM:4789,fork UDP4-SENDTO:172.17.0.1:4789"
求助问题
- 如何直连
192.168.65.3上的Docker Swarm服务且保留源IP? - 如何在Visual Studio中连接远程Linux主机运行开发容器,避免每次测试都推送代码至服务器?
解决方案
问题1:直连192.168.65.3的Swarm服务并保留源IP
方法1:添加Windows静态路由打通隔离网络
- 用
ipconfig命令查看Windows主机物理网卡名称(如以太网) - 执行命令添加静态路由,让其他Swarm节点的IP段路由到Docker隔离网络网关:
示例:若其他节点在route add <Swarm节点IP段> mask 255.255.255.0 192.168.65.1 -p192.168.10.0/24,则执行:route add 192.168.10.0 mask 255.255.255.0 192.168.65.1 -p-p参数表示永久保存路由,重启后生效 - 打开Docker Desktop,进入
Settings > Resources > Network,勾选Allow the default Docker subnet to be used for external connections - 验证:在其他Swarm节点执行
telnet 192.168.65.3 2377,此时源IP会保留节点真实IP
方法2:修改Docker daemon配置让Swarm监听主机IP
- 打开Docker Desktop的
Settings > Docker Engine,修改配置让dockerd同时监听主机IP和本地套接字:
若需TLS安全连接,配置示例:{ "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] }{ "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"], "tls": true, "tlscacert": "/path/to/ca.pem", "tlscert": "/path/to/server-cert.pem", "tlskey": "/path/to/server-key.pem", "tlsverify": true } - 重启Docker Desktop,此时Swarm服务会监听主机所有IP,其他节点连接时源IP不会被NAT改写
问题2:Visual Studio连接远程Linux主机运行开发容器
步骤1:配置远程Linux主机的Docker守护进程
- 编辑远程主机的
/etc/docker/daemon.json文件:
需安全连接则用{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }2376端口并配置TLS证书 - 重启Docker服务:
sudo systemctl restart docker - 开放防火墙端口:
sudo firewall-cmd --add-port=2375/tcp --permanent sudo firewall-cmd --reload
步骤2:在Visual Studio中配置远程Docker连接
- 打开
Tools > Options > Container Tools > Docker - 在
Docker daemon endpoint输入远程主机IP和端口,如tcp://192.168.1.100:2375 - 点击
Test Connection验证,成功后保存配置
步骤3:实现本地代码实时同步到远程容器
- 在项目的
docker-compose.yml中添加卷映射,将本地代码目录挂载到远程容器:services: your-app: build: . volumes: - ${LOCAL_WORKSPACE_FOLDER}:/app${LOCAL_WORKSPACE_FOLDER}是Visual Studio内置变量,指向当前项目根目录 - 确保远程主机目标目录权限允许Docker读写:
sudo chown -R $USER:$USER /path/to/remote/app/folder - 启动容器后,本地代码修改会实时同步到远程容器,无需手动推送
内容的提问来源于stack exchange,提问作者5andr0
相关产品推荐
相关产品推荐

