私有注册表上的代理登录后面的代理提供TLS握手超时

时间:2017-04-21 11:48:35

标签: docker proxy

我们有一个私有的docker注册表在工作(基于portus,但无论如何),我尝试将图像推送到此注册表,但它不起作用。它失败并显示以下错误消息:

$ sudo docker login archive.docker-registry.mycompany.com
Username: mylogin
Password: 
Error response from daemon: Get https://archive.docker-registry.mycompany.com/v1/users/:
    net/http: TLS handshake timeout
$ 

我已经在/etc/systemd/system/docker.service.d/http-proxy.conf中配置了代理(我的docker在centos 7上):

[Service]
Environment="HTTP_PROXY=http://proxy.mycompany.com:8000/" "NO_PROXY=localhost,127.0.0.1,archive.docker-registry.mycompany.com"

但它仍然失败。

我尝试在url中使用http或https来使用HTTPS_PROXY而不是HTTP_PROXY,我尝试手动下载证书并在系统中配置它们(update-ca-certs)但它仍然失败。

当我以root身份更改此配置文件时,我执行了:

# systemctl daemon-reload
# systemctl restart docker

4 个答案:

答案 0 :(得分:2)

实际上,我发现如果我注释掉完整的环境线,它适用于私有注册表,但不适用于docker hub(当然,不再需要代理)。以下是适用于私有注册管理机构和docker hub公共注册管理机构的最终解决方案:

在NO_PROXY环境变量中,只应使用域名,而不是FQDN(包括"存档。"主机名前缀):

现在是我的配置文件:

[Service]
Environment="HTTP_PROXY=http://proxy.mycompany.com:8000/" "NO_PROXY=localhost,127.0.0.1,docker-registry.mycompany.com"

请注意,没有更多"存档。"也不是" portus。" NO_PROXY中的前缀,只是从" docker-registry"开始的域名。

当我看到docker登录命令行包括" archive。"前缀,这是误导,我认为它必须在NO_PROXY环境变量...但不,它不应该。

希望它有所帮助。我希望我之前在谷歌上找到了答案,但我没有,所以我只是在这里发帖,这可能对某人有帮助。

答案 1 :(得分:1)

如果使用的是私有注册表,则需要将其证书放在/etc/docker/certs.d/ 注册表名称 /ca.crt

注册名将相应更改

另外,请将您的 MTU 大小更改为1300,这也是我解决该错误的一件事。注册表之一,我相信您可能已经做过。 更改MTU的命令

ip link set dev eth0 mtu 1300

MTU大小对于检查很重要

答案 2 :(得分:1)

我安装的最新稳定版本(18.xx)出现了此问题,降级到17.12.0-ce后,对我来说效果很好。

答案 3 :(得分:0)

如果您的docker daemon代理配置不正确,则会出现TLS handshake timeout错误。

# verify docker daemon proxy configuration
/etc/systemd/system/docker.service.d/proxy.conf

# flush changes
sudo systemctl daemon-reload

# restart docker service
sudo systemctl restart docker 

有关更多详细信息,请参见https://docs.docker.com/config/daemon/systemd/#httphttps-proxy