前言

截止至文章发表时,DockerDesktop的最新版本为v4.11.1。本文以该版本为准。

Docker在windows运行在Hyper-v的虚拟机中或者wsl windows子系统中。

原因说明

网上大部分的操作都无法解决远程访问的问题

比如,在DockerDesktop的settings中勾选Expose daemon on tcp://localhost:2375 without TLS,也只是开启localhost/127.0.0.1端口2375的监听。这个是无法实现开启远程访问的

docker开放范围端口 docker开放2375端口_容器

 再比如说,在上一步基础上,在Docker Engine添加。这里确实是可以监听任何ip的2375端口。按理来说是可行的,实际上却无法是实现远程访问的!

"hosts": ["tcp://0.0.0.0:2375"]

docker开放范围端口 docker开放2375端口_docker_02

原因:别忘了文章前说的,windows环境下的Docker是运行在Hyper-v的虚拟机中或者是wsl windows子系统中,这些虚拟机和宿主机是NAT方式连接的,宿主机的物理网络和虚拟机网是不在同一子网中。

因此在上面两步的基础上,还需要解决虚拟机和宿主机网络不在同一子网的问题。

解决方案

多方寻找,在IBM的某个产品文档里找到了一个方式,解决虚拟机与宿主机不在同一子网上时通过宿主机ip访问docker守护进程

IBM DocumentationIBM Documentation.https://www.ibm.com/docs/en/addi/6.1.0?topic=prerequisites-configuring-docker-engine-listen-tcp-socket

docker开放范围端口 docker开放2375端口_docker_03

 重点看截图红框框,对于使用DockerDesktop,需要在宿主机设置代理监听本地127.0.0.1:2375。

因此,正确步骤就是

1、在DockerDesktop的settings中勾选Expose daemon on tcp://localhost:2375 without TLS,点击“Apply & Restart”,重启DockerDesktop

2、在CMD(管理员模式)中执行命令

#替换 <your_IP>为 docker 主机的公共 IP 地址
netsh interface portproxy add v4tov4 listenport=2375 listenaddress=<your_IP> connectaddress=127.0.0.1 connectport=2375

就可以正确开放远程2375端口了

docker开放范围端口 docker开放2375端口_运维_04

宿主机使用本机ip可以访问,但其他机器访问宿主机ip不通,则需要在windows防火墙开放端口

防火墙配置中,入站和出站都需要开放2375端口


补充

1、解决方案第2步设置代理无效或者windows重启后失效,需要检查IP Help服务正常运行,重启该服务即可。建议将其设为自动启动。

docker开放范围端口 docker开放2375端口_docker开放范围端口_05

 

docker开放范围端口 docker开放2375端口_nginx_06

 

2、解决方案第2步除了使用netsh命令添加代理,也可以在宿主机上使用nginx转发127.0.0.1:2375

# nginx配置文件nginx.conf添加如下配置
stream {
    server {
        listen 2375;
        proxy_pass 127.0.0.1:2375;
    }
}