适用于 Windows 的 Docker:尝试拉取时“服务器行为异常”

Leo*_* AB 5 docker

我正在尝试按照此处的 hello-world 指令在 Windows(操作系统:Microsoft Windows 10 Pro 64 位,Docker 版本:18.09.0,构建 4d60db4)上运行 docker 。然后我得到了以下“服务器行为不端”错误:

Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp: lookup <companyProxy> on 192.168.65.1:53: server misbehaving.
Run Code Online (Sandbox Code Playgroud)

我尝试按照此处的建议将 DNS(在 Docker 设置 - 网络 - DNS 服务器中)从自动更改为固定(8.8.8.8 或 8.8.4.4),但仍然没有解决问题,并导致了另一种类型的错误(“超时”)。

Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
Run Code Online (Sandbox Code Playgroud)

我支持公司的代理,并且在环境变量和 docker 设置上都设置了代理(和凭据)。我也尝试重新安装 docker 和 hyperV,但仍然遇到同样的问题。

有人可以帮忙吗?谢谢

Lio*_*ion 5

在将 Docker 从版本 17 升级到最新的 19(当前为 19.03.5)后,我们在企业代理后面的 Linux 上遇到了这个问题。

# docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp: lookup http on 1.2.3.4:53: server misbehaving.
Run Code Online (Sandbox Code Playgroud)

1.2.3.4是我们的 DNS 服务器的 IP,它本身运行良好 - 我可以解析不同的主机,也registry-1.docker.io来自 Docker。

解决方案

问题是我们如何/etc/systemd/system/docker.service.d/http-proxy.conf. 由于它是 MS AD 用户,因此它包含格式domain\user如下的用户名:

[Service]
Environment="HTTP_PROXY=http://domain\user:password@proxyserver.internal:80"
Run Code Online (Sandbox Code Playgroud)

同样的事情HTTPS_PROXY。虽然这适用于版本 17,但它似乎不适用于 19。现在反斜杠似乎会导致问题。只需像这样删除它:

[Service]
Environment="HTTP_PROXY=http://user:password@proxyserver.internal:80"
Run Code Online (Sandbox Code Playgroud)

如何检查这是否有问题

我不确定这是否随 19 版或 18 版而改变,因为我们跳过了 18 版。但如果您升级到 18 或 19 版,我会检查一下。有一个简单的方法来弄清楚:

 docker info | grep -i proxy
Run Code Online (Sandbox Code Playgroud)

如果您看到这样的审查凭据

HTTP Proxy: http://xxxxx:xxxxx@proxyserver.internal:80
HTTPS Proxy: http://xxxxx:xxxxx@proxyserver.internal:80
Run Code Online (Sandbox Code Playgroud)

那么你就不会受到这个问题的影响。但是,如果您看到普通凭据,Docker 将无法解析它们,因为反斜杠或您的 env 变量中包含其他特殊字符。


Syl*_*ard 2

我认为,上次配置中的超时是由于您没有通过代理到达那些外部 DNS 服务器(8.8.8.8 - 8.8.4.4)。

您应该解决第一个问题,即server misbehaving. 就像我的情况一样,这里提到,这是由于 docker 无法通过代理进行身份验证造成的。我的解决方案是使用cntml

如果您遵循他们的指南,配置cntlm实际上非常简单。当你cntlm运行时,你需要配置 docker 以使用它作为代理而不是你的公司代理。只是一个没有身份验证的普通代理 - 如果您在同一台计算机上运行它,则很可能是 127.0.0.1:3128。cntlm将处理公司代理上的身份验证。

作为参考,这是我使用的 cntlm 配置:

Username        <username>
Domain          <domain>
Password        <password>

PassLM          <PassLM output of cntlm -H>
PassNT          <PassNT output of cntlm -H>
PassNTLMv2      <PassNTLMv2 output of cntlm -H>

Proxy           <corporate proxy>:<corporate proxy port>
NoProxy         localhost, 127.0.0.*, 10.*, 192.168.*, 172.16.*.*

Listen          3128
Run Code Online (Sandbox Code Playgroud)

您可以通过运行来获取哈希值cntlm -H -u <username>@<domain>

确保以网关模式cntlm -g(而不是cntlm -v)运行 cntlm。

祝你好运!