使用Docker for Windows通过SSL拉取docker镜像失败

9

我使用的是Docker Engine 2.0.0.0-win77 (28777)版本。在我的macOS上,我已经成功地从公司的私有docker注册表中拉取了镜像。现在我想在我的Windows机器上做同样的事情。在进行任何操作之前,我已经:

> docker pull <company.docker.url>/<some image>
Error response from daemon: Get https://<company.docker.url>/v2/: x509: certificate signed by unknown authority

然后,我将证书导入到Windows用户证书存储中。 现在我有:

> docker pull <company.docker.url>/<some image>
Error response from daemon: Get https://<company.docker.url>/v2/: remote error: tls: handshake failure

在这次失败后,我尝试了以下操作:
  • 将证书导入到我的Windows全局证书存储中。
  • 将文件client.certclient.keyca.crt复制到我的Windows 10电脑中的以下目录:

    • C:\ProgramData\Docker\certs.d\<company.docker.url>\
    • C:\Users\<user>\.docker\certs.d\<company.docker.url>\

遗憾的是,我仍然遇到了这个问题:

> docker pull <company.docker.url>/<some image>
Error response from daemon: Get https://<company.docker.url>/v2/: remote error: tls: handshake failure

需要注意的两件事情:

  • 如果我切换到Windows容器,我可以成功登录或拉取镜像,只有在Linux容器版本中才失败。
  • 我的私人证书由一个中间证书签署,并且该中间证书包含在我的client.cert中。

我阅读过的一些参考文献:


你尝试过在docker客户端中明确指定tls目录吗?docker --tls-cert=C:\ProgramData\Docker\certs.d\docker.company.net\client.cert --tls-key=C:\ProgramData\Docker\certs.d\docker.company.net\client.key --tls-cacert=C:\ProgramData\Docker\certs.d\docker.company.net\ca.crt pull <company.docker.url>/<some image>。参考:https://docs.docker.com/engine/reference/commandline/cli/ - Robert
@Robert,我不认为这是问题,因为我认为 --tls* 选项用于连接正在本地主机上运行的docker守护进程。我的问题是无法连接远程docker仓库。 - Elderry
@Robert 我也尝试了你建议的命令,并得到以下错误信息:error during connect: Post https://127.0.0.1:2376/v1.37/images/create?fromImage=docker.compayn.net%2Ftradeshift-proxy&tag=148fbf3b3db5849f73675147c0f14def8766ee21: dial tcp 127.0.0.1:2376: connectex: No connection could be made because the target machine actively refused it. 可以看到它试图连接 127.0.0.1。 - Elderry
我明白了,你是对的。 - Robert
5个回答

0

您在建立与company.docker.url的TLS连接时遇到了问题。可能的问题:

  • company.docker.url仅允许使用Linux容器不支持的密码。使用https://github.com/drwetter/testssl.sh测试company.docker.url,并将检测到的密码列表与Linux容器支持的密码列表进行比较。(我猜Linux容器=一些Hyper-V VM,在其中可以直接调试TLS连接)。

  • 叶子证书和中间证书的顺序必须按特定顺序在您的证书文件中以形成正确的证书链 - 来自Golang文档https://golang.org/pkg/crypto/tls/#LoadX509KeyPair

    证书文件可以包含跟随叶子证书的中间证书,以形成证书链。


0
当我上周搞docker的时候,程序说需要Windows 10专业版,而我只有家庭版,所以无法让它工作。建议检查你的Windows 10版本。

这似乎更像是一条评论,请尝试详细阐述以真正回答问题。 - JJJ

0
在我的情况下,我们的Sophos防火墙阻止了访问。我直接连接到互联网上,它就可以工作了。我必须询问我的同事,为什么它被阻止了。

0

我会尝试两件事情:

  • 您是否在拉取镜像之前先尝试过docker login命令?
  • 重启客户端并重复操作。

0
我在Windows上也遇到了这个错误。在我的情况下,重新启动Docker守护程序有所帮助。

你使用过Windows容器吗?我发现在使用Linux容器时总是失败。 - Elderry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接