Windows的Docker:尝试拉时出现“服务器行为异常”

时间:2018-11-26 05:25:54

标签: docker

我试图通过遵循hello-world指令here在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.

我尝试按照建议here将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).

我在公司的代理服务器后面,并且已经在环境变量和docker设置上设置了代理服务器(和凭据)。 我也尝试重新安装docker和hyperV,但仍然遇到相同的问题。

有人可以帮忙吗?谢谢

4 个答案:

答案 0 :(得分:3)

在将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.

1.2.3.4是我们DNS服务器的IP,它本身可以正常工作-我可以解析不同的主机,也可以从Docker解析registry-1.docker.io

解决方案

问题是如何我们在/etc/systemd/system/docker.service.d/http-proxy.conf中全局设置代理。由于它是MS AD用户,因此它包含domain\user格式的用户名,如下所示:

[Service]
Environment="HTTP_PROXY=http://domain\user:password@proxyserver.internal:80"

HTTPS_PROXY相同。尽管此版本适用于版本17,但似乎不适用于版本19。现在,反斜杠似乎会引起问题。像这样删除它:

[Service]
Environment="HTTP_PROXY=http://user:password@proxyserver.internal:80"

如何检查是否有问题

我不确定这是在版本19中更改还是在版本18中更改,因为我们跳过了18。但是,如果您升级到18或19,则需要检查。有一种简单的方法可以解决这个问题:

 docker info | grep -i proxy

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

HTTP Proxy: http://xxxxx:xxxxx@proxyserver.internal:80
HTTPS Proxy: http://xxxxx:xxxxx@proxyserver.internal:80

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

答案 1 :(得分:0)

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

您应该解决第一个问题,即server misbehaving。与here中提到的情况一样,这是由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

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

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

祝你好运!

答案 2 :(得分:0)

我已经接受了上面的答案,但是由于未知的原因,几天后问题又出现了,但错误有所不同。幸运的是,我设法使用其他设置解决了该问题,如下所述。希望当接受的答案不起作用时,它可以对某人有所帮助。

首先,发生此错误的条件: CNTLM收听127.0.0.1:3128, HTTP和HTTPS的docker proxy(通过GUI设置)均为127.0.0.1:3128

Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp 10.0.75.1:3128: connect: connection refused

我检查了此similar case,但该解决方案也不适用于我。 我尝试了几种不同的方法,包括关闭防火墙,重现最初的问题(我的最初的问题)并重做已接受的解决方案,但无济于事。我意识到错误中显示的IP地址不是我的公司代理,也不是Cntlm侦听的端口,也不是我的本地主机,而是dockerNAT的IP。

然后,我还注意到在CNTLM -g -v行下方运行Cntlm ready, staying in the foreground时,在另一个终端中运行docker pull hello-world时没有任何反应。

this answer的启发,我尝试将docker上的Cntlm.ini和代理设置更改为10.0.75.1:3128,然后重新启动cntlm和docker。现在情况有所改变。错误消息更改为:

Error response from daemon: Get https://registry-1.docker.io/v2/: Parent proxy unreacheable

,当我按下docker pull命令时,Cntlm终端现在显示了一些内容,表明它以某种方式起作用。我怀疑代理主机名可能在此阶段引起问题,因为docker可能无法从VM访问DNS服务器。然后,我再次更改了Cntlm.ini,将代理的主机名更改为其IP地址,然后,现在docker pull hello-world可以正常工作了!

(TBH,我不完全理解为什么该解决方案有效的网络理论。如果有人可以提供一些解释,那将有所帮助。)

答案 3 :(得分:0)

我在Windows 10(主机操作系统)+ VMware + Ubuntu上遇到了同样的问题。

就我而言,问题是由公司的防火墙引起的。

以防万一您可能遇到相同的问题。我写了一篇关于它的文章:

Solve: Docker pull - "​... TLS handshake timeout"