在适用于Windows的Docker上,如何推送到端口转发到主机上的localhost的注册表?

时间:2019-06-17 19:56:33

标签: docker ssh portforwarding docker-registry

我只想把它放在这里,因为很难找到有关该主题的信息,我最终自己解决了。

设置

  • 带有公共IP地址的AWS上的堡垒主机
  • 在堡垒主机后面的专用子网中的注册表(图像注册表:2)
  • 通过堡垒成功完成ssh端口转发,将localhost:5000连接到注册表:5000

curl localhost:5000/v2/_catalog提供了已安装注册表的列表。

到目前为止很好。

docker tag {my image} localhost:5000/{my image}
docker push localhost:5000/{my image}

结果

The push refers to repository [localhost:5000/{my image}]                                                 
Get http://localhost:5000/v2/: dial tcp 127.0.0.1:5000: connect: connection refused

我们如何连接到转发到localhost的注册表端口?

1 个答案:

答案 0 :(得分:0)

我发现一些晦涩的帖子暗示您需要制作一个自定义特权容器,并在容器内进行ssh堡垒端口转发。这实际上是在解决docker守护程序实际上在虚拟机内部运行这一事实所引起的问题!

https://docs.docker.com/docker-for-windows/networking/

您可以在此处找到提示:

  

我想从主机连接到主机上的服务   IP地址正在更改(如果没有网络访问权限,则没有)。   从18.03开始,我们建议您连接到特殊的DNS   名称host.docker.internal,解析为内部IP地址   由主机使用。这是出于发展目的,不适用于   用于Windows的Docker桌面之外的生产环境。

因此,鉴于以上所述,我认为即使该建议是针对容器的,Docker守护程序本身也可能在相似的上下文中对docker cli命令起作用。

因此,首先,您需要在docker守护程序设置中将host.docker.internal:5000添加为不安全的注册表。在适用于Windows的Docker上,可以在“设置”>“守护程序”>“不安全的注册表”中找到它。不幸的是,这不算作localhost,因此必须这样做(Docker默认允许localhost不安全的注册表)。然后简单地:

docker tag {my image} host.docker.internal:5000/{my image}
docker push host.docker.internal:5000/{my image}

成功!

希望这对其他一些非常困惑的开发人员有所帮助。