如何为另一个容器中尚未启动的容器创建DNS条目?

时间:2017-04-19 08:34:24

标签: docker docker-networking

我正在尝试运行一个容器集群。通过环境变量为每个实例提供其他实例的主机和端口列表。 我想使用docker网络(即NOT主机网络)。我的想法是为每个实例提供一个带有“--name”(或--network-alias)运行选项的显式主机名。

所以我想这样开始:

docker run --name x1 -e clusterMembers=x2:12345,x3:12345 --network=mynet -d my/image
docker run --name x2 -e clusterMembers=x1:12345,x3:12345 --network=mynet -d my/image
docker run --name x3 -e clusterMembers=x1:12345,x2:12345 --network=mynet -d my/image

问题在于,当我启动第一个引用主机名x2和x3的容器时,这些主机名尚不存在于Docker网络DNS中。我的服务器启动,执行查找,失败,服务器再次退出(不,我无法更改代码重试DNS查找)。 请注意,如果其他实例尚不可访问,服务器将不会失败...只是它不能容忍DNS查找失败。

知道如何让容器x1(以及主机名x3到容器x2)的主机名x2和x3可用吗?

我尝试使用“--add-host”选项将假条目添加到/ etc / hosts文件中,但当然这个伪条目将“遮蔽”DNS查找,服务器将永远看不到一旦启动其他实例,即使是IP地址。

除了使用主机网络之外,还有什么方法可以完成这项工作?

我根据BMitch的建议提出的解决方案是采取等待它的脚本,稍微调整一下,以便不是“ping”主机+端口,而是只对DNS进行DNS查找给予主持人。

然后,在我的容器入口点脚本中,我首先从上面示例中的“clusterMembers”环境变量中提取主机名,并使用我的wait-for-dns脚本和每个主机名。

2 个答案:

答案 0 :(得分:0)

我会在图像中更改或添加一个类似于wait-for-it的入口点。然后,您可以按任何顺序启动容器,无需担心竞争条件或为尚不存在的容器注入DNS地址。

答案 1 :(得分:0)

  

我尝试过" - add-host"将伪条目添加到/ etc / hosts文件的选项,但当然这个伪条目将会" shadow" DNS查找,即使其他实例启动,服务器也永远不会看到正确的IP地址。

我建议你将这种方法与为每个容器分配特定的IP地址结合起来:

docker run --name x1 --add-host="x2:172.17.42.102" --add-host="x3:172.17.42.103" --ip="172.17.42.101" --network=mynet -d my/image

相关问题