Fork me on GitHub

Docker容器内DNS异常故障处理

容器DNS异常处理

问题详情

最近公司开发使用的一个 maven 仓库(nexus) 说同步阿里云Maven 源失败,这个仓库是使用容器部署的。

排查问题

  1. 首先就是登陆到容器, ping www.baidu.com 发现网络不可达,确定是容器网络不能访问外网。
  2. 第二步查看容器的网络模式,使用的桥接网络。
  3. 查看对应的主机,主机是否访问外网,查询之后是可以访问的。
  4. 继续登陆到容器, 通过 ping IP 看网络是否可达, 发现IP 可达,就基本是定位到是 DNS 的问题了。
  5. 查看容器内部的 DNS, 发现设置的 DNS 是ping 不通的,询问网络工程师,这两个 DNS IP 已经不能使用了。需要使用新的DNS 对应的IP。

问题解决

既然找到了问题,是容器 DNS 的问题,那么就需要更改,DNS ,我进入到 容器内部,进行更改文件 /etc/resolv.conf. 但是我进行编辑这个文件 是不可写,只能读。

查看下Docker 的官方文档,官方文档写到

By default, a container inherits the DNS settings of the host, as defined in the /etc/resolv.conf configuration file. Containers that use the default bridge network get a copy of this file, whereas containers that use a custom network use Docker’s embedded DNS server, which forwards external DNS lookups to the DNS servers configured on the host.

Custom hosts defined in /etc/hosts are not inherited. To pass additional hosts into your container, refer to add entries to container hosts file in the docker run reference documentation. You can override these settings on a per-container basis.
翻译大概意思就是:
默认情况下, 容器会继承容器所在的宿主机的DNS配置(/etc/resolv.conf ), 如果使用的是桥接网络,将会基于宿主机的(/etc/resolv.conf) 创建副本,
自定义网络的容器将使用 Docker’s embedded DNS server,  自定义的网络将不会继承 /etc/hosts 

解决办法,应该是宿主机的 /etc/resolv.conf 文件发生了变动,然后对应的容器没有获取到最新的配置,重启下对应的 容器,让容器获取到最新的 DNS 配置即可。

扩展

扩展中的内容未验证。 我简单验证了下,在宿主机更改了 /etc/resolv.conf ,对应的虚拟机没有发生改变。

https://cloud.tencent.com/developer/article/1083218

当创建容器的 /etc/resolv.conf ,Docker daemon会从主机的原始文件中过滤掉所有localhost IP地址 nameserver 条目。

过滤是必要的,因为主机上的所有localhost地址都不可从容器的网络中访问。 过滤之后,如果容器的 /etc/resolv.conf 文件中没有更多的 nameserver 条目

您可能会想知道宿主机的 /etc/resolv.conf 文件发生了什么变化。 docker daemon有一个文件更改通知程序,它将监视主机DNS配置的更改。

注意 :文件更改通知程序依赖于Linux内核的inotify功能。由于此功能目前与overlay文件系统驱动不兼容,因此使用“overlay”的Docker daemon将无法利用 /etc/resolv.conf 自动更新的功能。

当宿主机文件更改时,所有 resolv.conf 与主机匹配的停止的容器将立即更新到最新的主机配置。 当宿主机配置更改时,运行的容器将需要停止并开始接收主机更改,这是由于缺少设备,以确保在容器运行时对 resolv.conf 文件的原子写入。 如果容器修改了默认的 resolv.conf 文件,则不会替换该文件,因为如果替换,将会覆盖容器执行的更改。 如果选项( --dns--dns-search--dns-opt )已被用于修改默认的主机配置,则更换主机的 /etc/resolv.conf 也不会发生。

注意 :对于在Docker 1.5.0中实现 /etc/resolv.conf 更新功能之前创建的容器:当主机 resolv.conf文件更改时,这些容器将不会收到更新。 只有使用Docker 1.5.0及以上版本创建的容器才能使用此自动更新功能。

posted @ 2020-11-15 22:17  自由早晚乱余生  阅读(4981)  评论(0编辑  收藏  举报