我的 docker 容器没有互联网

2024-02-22

我本来可以正常工作,但现在停止了。我尝试了以下命令但没有效果:

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个选择:

  1. 在 daemon.json 中对 DNS 服务器进行硬编码。这很简单,但如果您希望 DNS 服务器发生更改,则并不理想。

  2. 修复主机的/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.confUbuntu 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(使用前将#替换为@)

我的 docker 容器没有互联网 的相关文章

随机推荐