我本来可以正常工作,但现在停止了。我尝试了以下命令但没有效果:
docker run -dns 8.8.8.8 base ping google.com
docker run base ping google.com
sysctl -w net.ipv4.ip_forward=1
- 在主机和容器上
我得到的只是unknown host google.com
。 Docker 版本 0.7.0
有任何想法吗?
P.S. ufw
也禁用
首先要检查的是运行cat /etc/resolv.conf
in the 码头集装箱。如果它有一个无效的 DNS 服务器,例如nameserver 127.0.x.x
,那么容器将无法将域名解析为ip地址,所以ping google.com
将失败。
第二件事要检查的是运行cat /etc/resolv.conf
on the 主机。 Docker 基本上复制了主机的/etc/resolv.conf
每次启动容器时都会发送到容器。所以如果楼主的/etc/resolv.conf
错了,那么docker容器也会错。
如果您发现主机/etc/resolv.conf
是错误的,那么你有2个选择:
在 daemon.json 中对 DNS 服务器进行硬编码。这很简单,但如果您希望 DNS 服务器发生更改,则并不理想。
修复主机的/etc/resolv.conf
。这有点棘手,但它是动态生成的,并且您没有对 DNS 服务器进行硬编码。
1.在docker daemon.json中硬编码DNS服务器
-
Edit /etc/docker/daemon.json
{
"dns": ["10.1.2.3", "8.8.8.8"]
}
重新启动 docker 守护进程以使这些更改生效:
sudo systemctl restart docker
现在,当您运行/启动容器时,docker 将填充/etc/resolv.conf
的值来自daemon.json
.
2.修复主机问题/etc/resolv.conf
A.Ubuntu 16.04 及更早版本
对于 Ubuntu 16.04 及更早版本,/etc/resolv.conf
由 NetworkManager 动态生成。
注释掉该行dns=dnsmasq
(有一个#
) in /etc/NetworkManager/NetworkManager.conf
重启NetworkManager即可重新生成/etc/resolv.conf
:
sudo systemctl restart network-manager
在主机上验证:cat /etc/resolv.conf
B.Ubuntu 18.04 及更高版本
Ubuntu 18.04改用systemd-resolved生成/etc/resolv.conf http://manpages.ubuntu.com/manpages/bionic/man8/systemd-resolved.service.8.html#contenttoc3。现在默认情况下它使用本地 DNS 缓存 127.0.0.53。这在容器内不起作用,因此 Docker 将默认使用 Google 的 8.8.8.8 DNS 服务器,这对于防火墙后面的人来说可能会中断。
/etc/resolv.conf
实际上是一个符号链接(ls -l /etc/resolv.conf
) 指向/run/systemd/resolve/stub-resolv.conf
Ubuntu 18.04 中默认为 (127.0.0.53)。
只需更改符号链接即可指向/run/systemd/resolve/resolv.conf
,其中列出了真实的 DNS 服务器:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
在主机上验证:cat /etc/resolv.conf
现在你应该有一个有效的/etc/resolv.conf
在主机上供 docker 复制到容器中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)