Windows容器无法访问互联网

问题描述

运行基于Windows的容器,我无法从内部访问Internet。示例:

在主机上,我可以运行以下命令:

PS C:\Developer> nslookup aka.ms
Server:  cache100.ns.tdc.net
Address:  193.162.153.164

Non-authoritative answer:
Name:    aka.ms
Address:  88.221.62.148

当我尝试从容器内部执行此操作时:

PS C:\Developer> docker run mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-ltsc2019 powershell nslookup aka.ms
*** UnKnown can't find aka.ms: Server failed
Server:  UnKnown
Address:  172.28.112.1

虽然我对aka.ms并没有特别的兴趣,但是我尝试连接的所有服务都会发生此错误,因此我无法安装外部库等。

我正在运行Docker Desktop v19.03.12。无论是否启用WSL 2,都会发生该行为,并且Docker设置均为默认值。


注意:我前段时间曾经历过这种行为。那时,我在Dockerfile中添加了以下代码段:

RUN powershell -command certutil -generateSSTFromWU roots.sst && certutil -addstore -f root roots.sst && del roots.sst

据我了解,这将安装SSH证书,从而解决了该问题。但是,此命令现在失败:

PS C:\> certutil -generateSSTFromWU roots.sst
The server name or address could not be resolved 0x80072ee7 (WinHttp: 12007 ERROR_WINHTTP_NAME_NOT_RESOLVED) -- http://ctldl.windowsupdate.com/msdownload/update/v3/static/truste
dr/en/authrootstl.cab
CertUtil: -generateSSTFromWU command FAILED: 0x80072ee7 (WinHttp: 12007 ERROR_WINHTTP_NAME_NOT_RESOLVED)
CertUtil: The server name or address could not be resolved

解决方法

我在基本服务器核心映像上对此进行了测试,并通过添加DNS设置使它起作用。

我以交互方式连接到容器以对此进行测试,但您也可以将命令添加到DockerFile中。

docker run -it容器powershell

键入netsh以开始网络配置
首先,我们要查找要更改的网络
(在我的情况下为“以太网2”)
然后我们在此接口中添加静态DNS服务器

interface ip show config  
interface ipv4 set dns name="Ehternet 2" static 8.8.8.8  
exit

nslookup aka.ms

S C:\> nslookup aka.ms
Server:  dns.google
Address:  8.8.8.8

Non-authoritative answer:
Name:    aka.ms
Address:  23.38.17.26

Reference Docker Networking
Reference howto

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...