无法在企业代理内的docker windows容器内访问互联网

无法在企业代理内的docker windows容器内访问互联网

我需要从容器内部连接到互联网。

最初,Docker 守护进程无法连接到互联网,因此我无法运行:

docker pull hello-world

我通过在资源下的 docker 桌面 GUI 设置中指定手动代理来解决这个问题
一旦我手动设置代理,我就能够拉取 hello-world 图像 - 所以我知道这个代理有效。

然后我创建了一个测试 Dockerfile,以查看在构建映像时是否可以让容器连接到互联网,这是 Dockerfile:

FROM mcr.microsoft.com/windows/servercore:1903
RUN curl 'www.google.co.za'

并得到以下输出:

PS C:\Projects\Test> docker build -t test:01 .

Sending build context to Docker daemon  3.906GB

Step 1/2 : FROM mcr.microsoft.com/windows/servercore:1903

---> 66c07b0d3e85

Step 2/2 : RUN curl 'www.google.co.za'

---> Running in 99f79ea70731

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve host: 'www.google.co.za'

The command 'cmd /S /C curl 'www.google.co.za'' returned a non-zero code: 6

正如建议的那样这里我尝试添加 DNS,如下所示:

"dns": ["1.1.1.1"]

但得到的结果与上述相同。
我之前在 Linux 容器中遇到过问题,无法在容器内安装软件包,因此我不得不将以下内容添加到 Dockerfile 中,这样就可以了:

ENV HTTP_PROXY http://myproxy:3128
ENV http_proxy http://myproxy:3128

我尝试在测试 Dockerfile 中执行此操作并得到此结果(请注意,这是没有 DNS 设置的输出):

PS C:\Projects\Test> docker build -t test:01 .

Sending build context to Docker daemon  3.906GB

Step 1/4 : FROM mcr.microsoft.com/windows/servercore:1903

---> 66c07b0d3e85

Step 2/4 : ENV HTTP_PROXY http://myproxy.com:3128

---> Using cache

---> d6bbca2c1984

Step 3/4 : ENV http_proxy http://myproxy.com:3128

---> Using cache

---> a22311c57c8d

Step 4/4 : RUN curl 'www.google.co.za'

---> Running in 3e3be3786b62

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100   874  100   874    0     0    874      0  0:00:01 --:--:--  0:00:01  1189

<HTML><HEAD>

<TITLE>Network Error</TITLE>

</HEAD>

<BODY>

<FONT face="Helvetica">

<big><strong></strong></big><BR>

</FONT>

<blockquote>

<TABLE border=0 cellPadding=1 width="80%">

<TR><TD>

<FONT face="Helvetica">

<big>Network Error (dns_unresolved_hostname)</big>

<BR>

<BR>

</FONT>

</TD></TR>

<TR><TD>

<FONT face="Helvetica">

Your requested host "'www.google.co.za'" could not be resolved by DNS.

</FONT>

</TD></TR>

<TR><TD>

<FONT face="Helvetica">

 

</FONT>

</TD></TR>

<TR><TD>

<FONT face="Helvetica" SIZE=2>

<BR>

For assistance, contact your network support team.<br><br>Your request was categorized by Blue Coat Web Filter as 'none'. <br>If you wish to question or dispute this result, please click <a href="http://sitereview.bluecoat.com/sitereview.jsp?referrer=136&url=http://'www.google.co.za'/">here</a>.

</FONT>

</TD></TR>

</TABLE>

</blockquote>

</FONT>

</BODY></HTML>

Removing intermediate container 3e3be3786b62

---> 79dcdbf32644

Successfully built 79dcdbf32644

Successfully tagged test:01

如果我将 DNS 设置重新添加到 Docker GUI,我会得到以下输出:

PS C:\Projects\Test> docker build -t test:01 .

Sending build context to Docker daemon  3.906GB

Step 1/4 : FROM mcr.microsoft.com/windows/servercore:1903

---> 66c07b0d3e85

Step 2/4 : ENV HTTP_PROXY http://myproxy.com:3128

---> Running in 4ac3e6e23b5f

Removing intermediate container 4ac3e6e23b5f

---> 6bfbb6923789

Step 3/4 : ENV http_proxy http://myproxy.com:3128

---> Running in 7e7b08cef7b3

Removing intermediate container 7e7b08cef7b3

---> 4a827371e6fa

Step 4/4 : RUN curl 'www.google.co.za'

---> Running in 317a2ea37342

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:--  0:00:10 --:--:--     0curl: (5) Could not resolve proxy: myproxy.com

The command 'cmd /S /C curl 'www.google.co.za'' returned a non-zero code: 5

因此,如果设置了 DNS,它就无法解析代理;如果未设置 DNS,它就无法解析 URL。我不知道接下来该怎么办。


需要从我的 curl 命令中删除文字单引号,但不幸的是这还没有解决我的问题。

我不太明白将 DNS 设置为“1.1.1.1”有什么作用,但从我读到的内容来看,我似乎应该将 DNS 指定为公司网络内的 DNS 服务器。我使用以下命令发现了此信息:

ipconfig -all

我在“以太网适配器以太网:”下看到 2 个 IP 地址被列为 DNS 服务器,因此我宁愿在 Docker Desktop GUI“Docker 引擎”设置中指定这 2 个 IP 地址。

然后我用以下 4 种排列进行测试:

  1. 在 Docker Desktop 中设置 DNS + 在 Dockerfile 中设置代理 ENV
  2. 在 Docker Desktop 中设置 DNS + 在 Dockerfile 中不设置代理
  3. Docker Desktop 中未设置 DNS + 在 Dockerfile 中设置代理 ENV
  4. Docker Desktop 中未设置 DNS + Dockerfile 中未设置代理

在每次测试中我尝试在构建过程中从我的dockerfile运行以下命令:

RUN curl www.google.co.za
RUN tracert www.google.co.za

设置 DNS 似乎对结果没有任何影响。设置 Dockerfile 中的 ENV HTTP_PROXY 似乎对 curl 命令有影响。如果不设置它,我得到以下输出:

Failed to connect to www.google.co.za port 80: Timed out

在 Dockerfile 中设置 ENV HTTP_PROXY 后,我得到了类似于 google.co.za 网站的 HTML,这让它看起来似乎在运行。但tracert命令显示请求已离开容器,但未通过我的默认网关,并报告“目标主机无法访问”。因此,不要运行卷曲命令www.google.co.za我使用了一个银行网站,这里 curl 命令报告:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
0     0    0     0    0     0      0      0 --:--:--  0:00:10 --:--:--     0

tracert 命令失败。我猜想运行卷曲www.google.co.za,我以某种方式获取了一个缓存页面。

所以我仍然陷入困境并寻求帮助。

答案1

您应该从 curl 命令中删除文字单引号。它们将被发送到代理服务器,以便它尝试查找名为的主机,'www.google.co.za'而不是理想的主机www.google.co.za

正确的应该是:

RUN curl www.google.co.za

相关内容