无法解析docker容器中的域名

无法解析docker容器中的域名,docker,dns,containers,Docker,Dns,Containers,我正在windows PC上的virtualbox中运行linux虚拟机。我在虚拟机中安装了docker。然后我使用docker run-it alpine启动了一个alpine容器 在此容器中,我可以成功ping外部IP。但是当我尝试ping域名时,例如google.com,它总是返回ping:bad address'google.com' 如果我做了nslookup google.com,它会告诉我无法解析“google.com”。但所有这些操作都可以在VM(容器外部)中成功完成 在容器的/

我正在windows PC上的virtualbox中运行linux虚拟机。我在虚拟机中安装了docker。然后我使用docker run-it alpine启动了一个alpine容器

在此容器中,我可以成功ping外部IP。但是当我尝试ping域名时,例如google.com,它总是返回
ping:bad address'google.com'

如果我做了
nslookup google.com
,它会告诉我
无法解析“google.com”
。但所有这些操作都可以在VM(容器外部)中成功完成

在容器的/etc/resolv.conf中是Google DNS服务器,
8.8.8.8
8.8.4.4
。而对于虚拟机,它是
127.0.1.1


有人知道类似的问题吗?

试着在
/etc/docker/daemon.json中添加
{“dns”:[“8.8.8.8”,“8.8.4.4”]}
取决于您工作的网络

在默认网络中,容器继承主机的DNS设置,如
/etc/resolv.conf
配置文件中所定义

使用自定义网络时,将使用Docker的嵌入式DNS服务器,该服务器将外部DNS查找转发到主机上配置的DNS服务器


在这两种情况下,您都不应该编辑容器的
/etc/resolv.conf
。这是由Docker完成的。

在虚拟机下运行时,我遇到了类似的问题。您只需将DNS服务器置于
docker run
命令中即可

docker run -it --dns 8.8.8.8 --dns 8.8.4.4 alpine
这个(相对)老问题是因为musl DNS库的错误实现,如中所述

在较新版本的alpine中,这似乎是固定的,因为alpine版本>=3.11.3使用DNS解析的内部实现,而不是musl的内部实现

$ docker run -it alpine nslookup google.com
Server:     192.168.65.1
Address:    192.168.65.1:53

Non-authoritative answer:
Name:   google.com
Address: 2404:6800:4012:1::200e

Non-authoritative answer:
Name:   google.com
Address: 172.217.160.110
$ docker run -it alpine nslookup google.com
Server:     192.168.65.1
Address:    192.168.65.1:53

Non-authoritative answer:
Name:   google.com
Address: 2404:6800:4012:1::200e

Non-authoritative answer:
Name:   google.com
Address: 172.217.160.110