【问题标题】:Docker for windows: "server misbehaving" when trying to pull适用于 Windows 的 Docker:尝试拉取时出现“服务器行为不端”
【发布时间】:2018-11-26 05:25:54
【问题描述】:

我正在尝试按照 hello-world 指令here 在 Windows(操作系统:Microsoft Windows 10 Pro 64bit,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 但仍然遇到同样的问题。

有人可以帮忙吗?谢谢

【问题讨论】:

  • 我从昨天开始在ubuntu下遇到了类似的问题。 Docker pull 总是返回:'来自守护进程的错误响应:获取registry-1.docker.io/v2/library/redis/manifests/latest:获取auth.docker.io/…:net/http:TLS 握手超时'
  • Docker 登录总是返回:'来自守护进程的错误响应:获取 registry-1.docker.io/v2:net/http:在等待连接时取消请求(等待标头时超出 Client.Timeout)'
  • @Leo.W 你也支持公司代理吗?你说是从昨天开始的,在这之前有用吗?
  • 对您的问题是肯定的。我已经解决了这个问题并写了一篇关于它的文章。正如您可能感兴趣的那样,我发布了对这个问题的答案以及文章链接。
  • 还要确保您的代理密码不包含特殊字符,尤其是@

标签: docker


【解决方案1】:

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

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

【讨论】:

  • 从 Environment="HTTP_PROXY=http: //domain\user:password@proxyserver.internal:80" 中删除域对我们有用。谢谢!
【解决方案2】:

我认为,您上次配置中的超时是由于您没有通过代理到达那些外部 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 &lt;username&gt;@&lt;domain&gt; 来获取哈希值。

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

祝你好运!

【讨论】:

  • 我尝试安装cntlm。当我运行它时,它说端口3128 已经在使用中。然后我尝试使用其他端口(我按照建议尝试了netstat,以查找未使用的端口),在这种情况下我尝试了8080。运行cntlm -v 显示没有问题,但是当我运行docker run hello-world 时,我得到Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp 10.0.75.1:8080: connect: connection refused. 你有什么想法吗?
  • 我终于成功了!最后一个缺失的部分是在网关模式cntlm -g(而不是cntlm -v)下运行cntlm。谢谢!!!
  • 你用这个设置成功了docker image build 吗?在我的情况下,docker run(或pull,或search)工作正常,但是在构建时以及每当它需要访问互联网(运行一些命令,如pipapk)时,它就会失败。我遵循了这个解决方案stackoverflow.com/a/38901128/5122657,但仍然无法正常工作
  • 不,我正在从远程仓库部署构建的镜像。我建议查看其中一些资源:stackoverflow.com/questions/48277599/…github.com/gliderlabs/docker-alpine/issues/171github.com/gliderlabs/docker-alpine/issues/191
  • 我去看看。谢谢!
【解决方案3】:

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

首先,这个错误发生的条件: CNTLM 监听127.0.0.1:3128, docker 代理(通过 GUI 设置)对于 HTTP 和 HTTPS 都是 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 监听的端口,也不是我的 localhost,而是 dockerNAT 的 IP。

然后,我还注意到,当我在Cntlm ready, staying in the foreground 行下方运行CNTLM -g -v 时,当我运行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 我不完全理解为什么这个解决方案有效的网络理论。如果有人能给出一些解释,那会很有帮助。)

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多