You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不可行

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"

求助问题

  1. 如何直连192.168.65.3上的Docker Swarm服务且保留源IP?
  2. 如何在Visual Studio中连接远程Linux主机运行开发容器,避免每次测试都推送代码至服务器?

解决方案

问题1:直连192.168.65.3的Swarm服务并保留源IP

方法1:添加Windows静态路由打通隔离网络

  1. 用ipconfig命令查看Windows主机物理网卡名称(如以太网)
  2. 执行命令添加静态路由,让其他Swarm节点的IP段路由到Docker隔离网络网关:
    route add <Swarm节点IP段> mask 255.255.255.0 192.168.65.1 -p
    
    示例:若其他节点在192.168.10.0/24,则执行:
    route add 192.168.10.0 mask 255.255.255.0 192.168.65.1 -p
    
    -p参数表示永久保存路由,重启后生效
  3. 打开Docker Desktop,进入Settings > Resources > Network,勾选Allow the default Docker subnet to be used for external connections
  4. 验证:在其他Swarm节点执行telnet 192.168.65.3 2377,此时源IP会保留节点真实IP

方法2:修改Docker daemon配置让Swarm监听主机IP

  1. 打开Docker Desktop的Settings > Docker Engine,修改配置让dockerd同时监听主机IP和本地套接字:
    {
      "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
    }
    
    若需TLS安全连接,配置示例:
    {
      "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
    }
    
  2. 重启Docker Desktop,此时Swarm服务会监听主机所有IP,其他节点连接时源IP不会被NAT改写

问题2:Visual Studio连接远程Linux主机运行开发容器

步骤1:配置远程Linux主机的Docker守护进程

  1. 编辑远程主机的/etc/docker/daemon.json文件:
    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
    }
    
    需安全连接则用2376端口并配置TLS证书
  2. 重启Docker服务:
    sudo systemctl restart docker
    
  3. 开放防火墙端口:
    sudo firewall-cmd --add-port=2375/tcp --permanent
    sudo firewall-cmd --reload
    

步骤2:在Visual Studio中配置远程Docker连接

  1. 打开Tools > Options > Container Tools > Docker
  2. 在Docker daemon endpoint输入远程主机IP和端口,如tcp://192.168.1.100:2375
  3. 点击Test Connection验证,成功后保存配置

步骤3:实现本地代码实时同步到远程容器

  1. 在项目的docker-compose.yml中添加卷映射,将本地代码目录挂载到远程容器:
    services:
      your-app:
        build: .
        volumes:
          - ${LOCAL_WORKSPACE_FOLDER}:/app
    
    ${LOCAL_WORKSPACE_FOLDER}是Visual Studio内置变量,指向当前项目根目录
  2. 确保远程主机目标目录权限允许Docker读写:
    sudo chown -R $USER:$USER /path/to/remote/app/folder
    
  3. 启动容器后,本地代码修改会实时同步到远程容器,无需手动推送

内容的提问来源于stack exchange,提问作者5andr0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:35:54