我们有一个私有的 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"
但仍然失败。
我尝试使用 HTTPS_PROXY 而不是 HTTP_PROXY 在 url 中使用 http 或 https,我尝试手动下载证书并在系统中配置它们(update-ca-certs),但它一直失败。
当我更改此配置文件时,以 root 身份执行:
# systemctl daemon-reload
# systemctl restart docker
实际上,我发现如果我注释掉完整的环境行,它适用于私有注册表,但不再适用于 docker hub(当然,不再有代理)。这是适用于私有注册表和 docker hub 公共注册表的最终解决方案:
在 NO_PROXY 环境变量中,仅应使用域名,而不应使用 FQDN(包括“archive.”主机名前缀):
这是我的配置文件:
[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 环境变量中......但不,它不应该。
希望它对某人有帮助。我希望我之前在谷歌上找到了答案,但我没有,所以我只是将其发布在这里,它可能会对某人有所帮助。
如果您使用的是私有注册表,则需要将其证书放置在 /etc/docker/certs.d/registryname/ca.crt
注册表名称将相应更改
另外,请将您的MTU大小更改为1300,这也是我为解决该错误所做的一件事。注册表一我相信您可能已经完成了。 MTU 更改命令
ip link set dev eth0 mtu 1300
检查 MTU 大小很重要
我安装的最新稳定版本(18.xx)有这个问题,降级到17.12.0-ce后,它对我来说工作正常。
如果您的 docker 守护进程代理配置不正确,您可能会收到
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
我在 MacOS 上使用 Docker Desktop 时遇到了这个问题。通过添加解决了
"debug": true
进入 Docker 引擎的配置(选项卡“设置”>“Docker 引擎”) 祝你好运