无法在Docker Windows容器内访问互联网

18

我正在尝试使用Docker Windows容器构建一个镜像。这是我的Dockerfile:

FROM mcr.microsoft.com/windows/servercore:ltsc2019 as installer
RUN Invoke-WebRequest -URI 'www.google.com'

当我运行这个程序时,它无法连接到Google.com。

Invoke-WebRequest : The remote name could not be resolved: 'www.google.com'
At line:1 char:73

我正在使用公司网络,并尝试使用以下命令设置代理:RUN netsh winhttp set proxy proxy-server="http://proxy.com:80" bypass-list="*.xyz.com",并且还导入了注册表项 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

在我的容器中运行 ipconfig /all 命令会得到以下结果:

Windows IP Configuration

   Host Name . . . . . . . . . . . . : 0d5119fe9ce4
   Primary Dns Suffix  . . . . . . . :
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter
   Physical Address. . . . . . . . . : 00-15-5D-B4-55-54
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fd80::a1f4:ab74:983:af83%4(Preferred)
   IPv4 Address. . . . . . . . . . . : 172.xxx.xxx.xx(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.xxx.xxx.xx
   Default Gateway . . . . . . . . . : 172.xxx.xxx.xx
   DHCPv6 IAID . . . . . . . . . . . : 67114333
   DHCPv6 Client DUID. . . . . . . . : 00-01-40-01-25-D1-CB-C4-00-15-5D-D4-A5-54
   DNS Servers . . . . . . . . . . . : 172.xxx.xxx.xx
                                       10.xxx.xxx.xx
   NetBIOS over Tcpip. . . . . . . . : Disabled

我怀疑存在一些DNS/防火墙问题或者没有正确设置代理。请有人帮助我确定根本原因并解决这个问题。


当您创建容器并尝试连接到互联网时,是否会出现相同的错误?在容器内运行以下命令:docker run -it mcr.microsoft.com/windows/servercore:ltsc2019 powershell 然后在容器内执行 Invoke-WebRequest -Uri 'www.google.com' -UseBasicParsing 命令? - Mike-314
6个回答

35

1
我仍然很震惊这对我起作用了。我在Windows 11的Docker桌面上进行任何互联网构建操作都非常不稳定。更改DNS设置解决了不稳定的网络操作。 - BozoJoe
哇塞,我尝试了所有方法,这个对我也起作用了!我在AWS RDS中有开发数据库,并需要在本地容器中进行开发。这个方法奏效了!我尝试了所有方法都无法连接,但这个可以!(我甚至不知道为什么它有效哈哈) - EddieV223
在我的情况下,我的所有的码头工人突然失去了互联网访问权限,原因不明。这个方法有效,谢谢。 - Daniel Restrepo
这应该出现在与Docker和Windows容器相关的每个微软页面上。浪费了3天时间,试图让“快速入门”应用程序运行起来 :-( - Ross Halliday

8

可以通过指定网络命令来解决问题。适用于buildrun

docker build --network="Default Switch" .

docker run --rm -it --network="Default Switch" mcr.microsoft.com/windows/servercore:ltsc2019

这个名称是从这里获取的:

docker network ls
NETWORK ID     NAME             DRIVER    SCOPE
79b90200b5ad   Default Switch   ics       local
07ffb031d4b7   nat              nat       local
6682d6220de5   none             null      local

由于某些原因,Docker 默认的 (nat) 网络无法连接互联网。


最终我解决了问题,所以默认(nat)开始工作了,但是我不记得具体是怎么做的。 我认为我的网络卡配置有误,它正在使用一些奇怪的Windows代理。 - lukee

4

最终在这里找到了一个简单明了的答案 https://github.com/docker/for-win/issues/2760#issuecomment-430889666

基本上需要将您的互联网连接设置为优先级最高:

  1. 查找您的互联网接口,例如'Wi-Fi' Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending

  2. 通过将其设置为最低值使其成为最高优先级 Set-NetIPInterface -InterfaceAlias 'Wi-Fi' -InterfaceMetric 1


1
在相关讨论中,另一个建议对我起到了作用:禁用以太网适配器。我正在使用无线网络的笔记本电脑上,而Hyper-V却将错误的网络适配器与Docker使用的底层虚拟机共享。 - Loris

3

我之前遇到了类似的问题,这是因为我连接了 VPN 但没有在 Cisco AnyConnect 中启用 "在配置 VPN 时允许本地(LAN)访问" 设置。如果有其他人遇到相似的问题,请注意检查此设置是否已启用。


0
我遇到了同样的问题。对我有用的方法是创建一个新的网络:
docker network create --driver nat my-new-network

然后我在docker build命令中使用了新的网络。
docker build --network=my-new-network .

0
在Docker Desktop中,转到"设置" > "Docker Engine",并将以下行添加到其中。
JSON config:
"dns":[8.8.8.8]
It looks like this:
{
  "dns": [
    "8.8.8.8"
  ],
  "experimental": false
}

应用并重新启动。一旦重新启动,进入任何正在运行的容器,并执行 "ping google.com",它应该可以正常工作。谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接