无法从同一网络中的另一个 docker 容器解析设置的主机名



我有数据库和服务器容器,它们都在同一个网络中运行。可以通过数据库主机的容器id对其进行ping,没有问题。当我手动为数据库容器设置主机名(-h myname(时,它产生了效果($ hostname返回set host(,但我无法从同一网络中的另一个容器ping该主机名。容器id仍然可以ping。尽管它在docker compose中工作没有问题。我错过了什么?

docker的内置DNS服务不使用主机名。这是一个违反直觉的例外,但由于主机名的更改可能超出docker的控制范围,所以这是有道理的。Docker的DNS将解析:

  • 容器id
  • 容器名称
  • 为该网络上的容器定义的任何网络别名

这些选项中最简单的是最后一个选项,该选项在使用compose文件运行容器时会自动配置。服务名称本身就是一个网络别名。这使您可以在不重新配置其他容器的情况下扩展和执行滚动更新。

您需要在用户创建的网络上,而不是像禁用DNS的默认网桥那样。当使用compose文件运行容器时,默认情况下会执行此操作。

避免使用链接,因为它们已被弃用。我只建议为不在任何DNS中的外部静态主机添加主机条目,对于容器到容器,或者访问docker之外的其他主机,DNS是首选。

我发现,这个问题可以在不使用网络的情况下使用--add host选项来解决。使用inspect命令可以获得容器的IP。

但当容器在同一网络中时,它们可以通过it名称相互访问。

如docker文档中所述,如果在默认网桥网络上启动容器,则添加-h myname会将此信息添加到

  • /etc/hosts
  • /etc/resolv.conf
  • 和bash提示符

容器刚刚启动。

但是,这不会对其他独立容器产生任何影响。(您可以使用--link将此信息添加到其他容器的/etc/hosts中。但是,不推荐使用--link。(

另一方面,当您创建用户定义的网桥网络时,docker提供了一个嵌入式DNS服务器,可以在该网络上的容器之间进行名称查找,请参阅用户定义网络中的嵌入式DNS服务器。名称解析采用--name定义的容器名称。(你使用其--hostname值将找不到其他容器。(

它与docker-compose一起工作的原因是,docker-compose为您创建了一个自定义网络,并自动命名容器。


如果您自己没有指定容器的名称,情况似乎有点不同。运行参考显示

如果不使用--name选项分配容器名称,则守护进程将为您生成一个随机字符串名称。[…]如果指定了名称,则可以在引用Docker网络中的容器时使用该名称。

根据您的发现,这应该理解为:如果您没有指定自定义--name,则不能使用自动生成的名称在同一网络上查找其他容器。

最新更新