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

时间:2018-11-17 23:21:58

标签: docker

我有数据库和服务器容器,它们都在同一网络中运行。可以通过其容器ID对数据库主机进行ping操作,没有问题。 手动为数据库容器设置主机名(-h myname时,它具有效果($ hostname返回设置的主机),但是我无法从同一网络中的另一个容器ping该主机名。容器ID仍可ping通。 虽然它在docker compose中没有问题。 我想念什么?

3 个答案:

答案 0 :(得分:1)

docker的内置DNS服务未使用主机名。这是一个违反直觉的例外,但是由于主机名可以在Docker的控制范围之外进行更改,因此这是有道理的。 Docker的DNS将解决:

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

这些选项中最简单的是最后一个选项,在运行带有撰写文件的容器时会自动对其进行配置。服务名称本身是网络别名。这样一来,您就可以扩展和执行滚动更新,而无需重新配置其他容器。

您需要位于用户创建的网络上,而不是像已禁用DNS的默认网桥那样。在运行带有撰写文件的容器时,默认情况下会完成此操作。

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

答案 1 :(得分:0)

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

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

刚刚启动的容器。

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

另一方面,当您创建用户定义的桥接网络时,docker提供了一个嵌入式DNS服务器,可以在该网络上的容器之间进行名称查找,请参见Embedded DNS server in user-defined networks。名称解析采用用--name定义的容器名称。 (您  不会通过使用其--hostname值来找到另一个容器。)

之所以与docker-compose配合使用,是因为docker-compose为您创建了一个自定义网络并自动命名了容器。


当您自己没有为容器指定名称时,情况似乎有所不同。 run reference

  

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

与您的发现一致,应理解为:如果未指定自定义--name,则不能使用自动生成的名称来查找同一网络上的其他容器。

答案 2 :(得分:0)

我发现,使用--add-host option无需网络即可解决该问题。容器的IP可以获取using inspect command

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