按照Matt Carrier 的建议在/etc/default/docker 中取消注释DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" 对我有用不。也没有将我公司的 DNS 服务器放在该文件中。但是,还有另一种方法(请继续阅读)。
首先,我们来验证一下问题:
$ docker run --rm busybox nslookup google.com # takes a long time
nslookup: can't resolve 'google.com' # <--- appears after a long time
Server: 8.8.8.8
Address 1: 8.8.8.8
如果命令似乎挂起,但最终吐出错误“无法解析 'google.com'”,那么你和我有同样的问题。
nslookup 命令查询 DNS 服务器 8.8.8.8 以便将“google.com”的文本地址转换为 IP 地址。具有讽刺意味的是,8.8.8.8 是Google's public DNS server。如果nslookup 失败,您的公司可能会阻止像 8.8.8.8 这样的公共 DNS 服务器(我认为这是出于安全原因)。
您认为将您公司的 DNS 服务器添加到 /etc/default/docker 中的 DOCKER_OPTS 应该可以解决问题,但无论出于何种原因,它都对我不起作用。我在下面描述了对我有用的方法。
解决方案:
在主机上(我使用的是 Ubuntu 16.04),找出主要和次要 DNS 服务器地址:
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
IP4.DNS[2]: 10.0.0.3
使用这些地址,创建一个文件/etc/docker/daemon.json:
$ sudo su root
# cd /etc/docker
# touch daemon.json
把这个放到/etc/docker/daemon.json:
{
"dns": ["10.0.0.2", "10.0.0.3"]
}
从根目录退出:
# exit
现在重启 docker:
$ sudo service docker restart
验证:
现在检查添加 /etc/docker/daemon.json 文件是否允许您将“google.com”解析为 IP 地址:
$ docker run --rm busybox nslookup google.com
Server: 10.0.0.2
Address 1: 10.0.0.2
Name: google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net
参考文献:
我的解决方案基于 Robin Winslow 的一篇文章,他的解决方案值得称赞。谢谢,罗宾!
“修复 Docker 的网络 DNS 配置。”罗宾温斯洛。检索 2016-11-09。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/