前言
截止至文章发表时,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 Engine添加。这里确实是可以监听任何ip的2375端口。按理来说是可行的,实际上却无法是实现远程访问的!
"hosts": ["tcp://0.0.0.0:2375"]
原因:别忘了文章前说的,windows环境下的Docker是运行在Hyper-v的虚拟机中或者是wsl windows子系统中,这些虚拟机和宿主机是NAT方式连接的,宿主机的物理网络和虚拟机网是不在同一子网中。
因此在上面两步的基础上,还需要解决虚拟机和宿主机网络不在同一子网的问题。
解决方案
多方寻找,在IBM的某个产品文档里找到了一个方式,解决虚拟机与宿主机不在同一子网上时通过宿主机ip访问docker守护进程
重点看截图红框框,对于使用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端口了
宿主机使用本机ip可以访问,但其他机器访问宿主机ip不通,则需要在windows防火墙开放端口
防火墙配置中,入站和出站都需要开放2375端口
补充
1、解决方案第2步设置代理无效或者windows重启后失效,需要检查IP Help服务正常运行,重启该服务即可。建议将其设为自动启动。
2、解决方案第2步除了使用netsh命令添加代理,也可以在宿主机上使用nginx转发127.0.0.1:2375
# nginx配置文件nginx.conf添加如下配置
stream {
server {
listen 2375;
proxy_pass 127.0.0.1:2375;
}
}