我从公共 Docker 注册表中提取映像并收到以下错误:
% docker pull ubuntu
Using default tag: latest
Error response from daemon: Head "https://registry-1.docker.io/v2/library/ubuntu/manifests/latest": Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull&service=registry.docker.io": EOF
这发生在我的工作笔记本电脑上,其中所有流量都通过始终开启的 VPN 路由。我可以暂时禁用它,但目标是让它正常工作和已连接公司 VPN。如果我禁用 VPN,则docker pull
一切正常。
此外,我公司还有一种解密 TLS 流量的做法,即通过在用户机器上安装公司的 CA 证书来实现,该证书作为解密流量的新根。TLS 解密仅在通过 VPN 工作时发生。
很明显,VPN 会干扰docker pull
,但我正在尝试弄清楚具体如何向网络团队请求修复。请帮我了解问题是否源于 TLS 解密实践,还是其他与网络相关的问题。
首先,Docker Desktop for Mac 的文档说:
支持所有受信任的 CA(根 CA 或中间 CA)。Docker Desktop 根据 Mac Keychain 创建所有用户信任的 CA 的证书包,并将其附加到 Moby 受信任的证书中。因此,如果主机上的用户信任企业 SSL 证书,Docker Desktop 也会信任该证书。
基于此,TLS 解密应该不是问题,因为正确的根 CA 证书已经在 Mac 的 Keychain 中。但是,由于 TLS 解密会导致许多其他问题,因此我仍然怀疑它。
其次,这可能是纯粹的网络问题。其中一个问题是已报告对于 Docker for Mac,错误消息完全相同,所有评论者都同意 OP 遇到了网络问题。为了排除这个问题,我尝试手动下载镜像:
token=$(curl -s 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull' | jq -r .token)
man_digest=$(curl -s 'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' -H "Authorization: Bearer $token" | jq '.manifests[] | select(.platform.architecture=="amd64")' | jq -r .digest)
blob_digest=$(curl -s "https://registry-1.docker.io/v2/library/ubuntu/manifests/$man_digest" -H "Authorization: Bearer $token" -H "Accept: application/vnd.oci.image.manifest.v1+json" | jq -r '.layers[0].digest')
curl -sL "https://registry-1.docker.io/v2/library/ubuntu/blobs/$blob_digest" -H "Authorization: Bearer $token" > layer0.blob
启用 VPN 后,成功了。因此,看起来提取映像所需的所有机制都有效,并且注册表可以访问。这让我重新怀疑证书验证,但此时我不知道如何继续。文档清楚地表明 Docker Desktop 应该使用 OS 证书存储;我确信此证书在存储中,因为我使用了完全相同的证书来修复其他工具(pip、poetry、curl 等)中的 SSL 验证。
也有可能问题不是出在这两者之一,而是出在其他方面。请建议下一步的故障排除步骤。