我在Windows PC上运行虚拟机中的Linux VM。我在VM中安装了docker。然后我通过“docker run -it alpine”开始了一个高山容器。在这个容器中,我可以成功ping外部IP。但是,当我尝试ping域名时,例如谷歌,它总是返回“ping:坏地址'google.com'。如果我做”nslookup google.com“,它会告诉我”无法解析'google.com'“。但所有这些操作都可以在VM中成功完成(在容器外部)。
在容器的/etc/resolv.conf中是Google DNS服务器,8.8.8.8和8.8.4.4。而对于VM,它是127.0.1.1。
任何人都知道类似的问题吗?
答案 0 :(得分:0)
尝试在{ "dns": ["8.8.8.8", "8.8.4.4"] }
中添加/etc/docker/daemon.json
。
答案 1 :(得分:0)
取决于您使用的网络。
在默认网络中,容器继承主机的 DNS 设置,如 /etc/resolv.conf
配置文件中所定义
当您使用自定义网络时,将使用 Docker 的嵌入式 DNS 服务器,它将外部 DNS 查找转发到主机上配置的 DNS 服务器。
在这两种情况下,您都不应编辑容器的/etc/resolv.conf
。这是由 Docker 完成的。
答案 2 :(得分:0)
我在虚拟机下运行时遇到了类似的问题。您可以将 DNS 服务器放在 docker run
命令中。
docker run -it --dns 8.8.8.8 --dns 8.8.4.4 alpine
答案 3 :(得分:0)
这个(相对)老问题是由于 musl DNS 库的错误实现,如 a comment of gliderlabs/docker-alpine #539 中所述。
$ docker run -it --rm alpine:3.4 nslookup google.com
nslookup: can't resolve '(null)': Name does not resolve
Name: google.com
Address 1: 216.58.200.46 tsa01s08-in-f46.1e100.net
Address 2: 2404:6800:4012:1::200e tsa03s06-in-x0e.1e100.net
在较新版本的 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