【问题标题】:Docker DNS ignoring /etc/nsswitch.conf on hostDocker DNS 忽略主机上的 /etc/nsswitch.conf
【发布时间】:2020-11-23 16:03:47
【问题描述】:

我有一个添加libvirt-nss/etc/nsswitch.conf 文件,以便在主机和来宾计算机上自动解析vm 主机名。然后我在主机上运行了一个 nginx 容器(带有--network host),它将流量路由到主机上的某些服务,其余的路由到虚拟机。然而,nginx 容器无法解析虚拟机的主机名,我怀疑 docker 引擎(?)不尊重主机的/etc/nsswitch.conf 来解析域名。有什么办法可以让这个工作还是我不走运?

【问题讨论】:

  • 容器有自己的/etc/nsswitch.conf文件;基于 Alpine 的图像可能根本无法实现这一点(因为它的 libc 实现相当少)。对于这个特定设置,您可能会发现直接在主机上运行 Nginx 更简单。

标签: docker nginx networking


【解决方案1】:

正如@DavidMaze 指出的那样,这是设计使然。有几种方法可以实现您似乎想要做的事情。

您可以将nsswitch.conf 文件添加到容器中。这在 Alpine 中确实有效。将其复制到Dockerfile 或使用绑定挂载:

$ docker run --rm -v /etc/nsswitch.conf:/etc/nsswitch.conf --add-host foobar.dns:8.8.8.8 busybox ping foobar.dns
PING foobar.dns (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=113 time=7.796 ms
64 bytes from 8.8.8.8: seq=1 ttl=113 time=7.809 ms

然后您可以使用docker --add-host 将主机名添加到容器的hostfile。或者,也绑定主机的 hosts 文件:

$ docker run --rm -v /etc/nsswitch.conf:/etc/nsswitch.conf -v /etc/hosts:/etc/hosts busybox ping foobar.dns
PING foobar.dns (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=113 time=16.961 ms

【讨论】:

  • 忘了在我的问题中提及,但我确实使用 --network host 运行容器,但这并没有这样做
  • @rosengrenen 你说得对,单独使用--network host 是行不通的,但是请参阅我在答案中的扩展示例,它会起作用。
  • 我尝试过类似的方法,但效果不佳,因为我在/etc/nsswitch.conf 的主机部分中有libvirtlibvirt_guest 条目,以及libvirt-nssvirsh 和所有这些东西在容器内都不可用,因此在尝试解析域时它只会引发系统错误。正如@David Maze 对我的问题的评论中提到的那样,在这种特殊情况下,我可能不得不求助于在没有 docker 的主机上运行 nginx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2017-09-14
相关资源
最近更新 更多