我需要从容器内部连接到互联网。
最初,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 种排列进行测试:
- 在 Docker Desktop 中设置 DNS + 在 Dockerfile 中设置代理 ENV
- 在 Docker Desktop 中设置 DNS + 在 Dockerfile 中不设置代理
- Docker Desktop 中未设置 DNS + 在 Dockerfile 中设置代理 ENV
- 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