我有数据库和服务器容器,它们都在同一网络中运行。可以通过其容器ID对数据库主机进行ping操作,没有问题。
手动为数据库容器设置主机名(-h myname
时,它具有效果($ hostname
返回设置的主机),但是我无法从同一网络中的另一个容器ping该主机名。容器ID仍可ping通。
虽然它在docker compose中没有问题。
我想念什么?
答案 0 :(得分:1)
docker的内置DNS服务未使用主机名。这是一个违反直觉的例外,但是由于主机名可以在Docker的控制范围之外进行更改,因此这是有道理的。 Docker的DNS将解决:
这些选项中最简单的是最后一个选项,在运行带有撰写文件的容器时会自动对其进行配置。服务名称本身是网络别名。这样一来,您就可以扩展和执行滚动更新,而无需重新配置其他容器。
您需要位于用户创建的网络上,而不是像已禁用DNS的默认网桥那样。在运行带有撰写文件的容器时,默认情况下会完成此操作。
避免使用链接,因为它们已被弃用。而且我只建议为不在任何DNS中的外部静态主机,容器到容器或访问docker以外的其他主机添加主机条目,首选DNS。
答案 1 :(得分:0)
如in the docker docs所述,如果您在默认网桥网络上启动容器,则添加-h myname
会将此信息添加到
刚刚启动的容器。
但是,这对其他独立容器没有任何影响。 (您可以使用--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。
但是,当容器位于同一网络中时,它们可以通过其名称相互访问。