为什么我无法在docker容器中解析域名

时间:2018-01-27 15:56:57

标签: docker dns containers

我在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。

任何人都知道类似的问题吗?

4 个答案:

答案 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