这里只提供了部分解决方案。
因此,当将您的服务附加到自定义覆盖网络时,您确实可以访问Docker的自定义服务发现功能。在尝试将其与您的问题联系起来之前,我将详细介绍Docker Swarm模式的网络功能。
我将使用不同的术语“服务”和“任务”,其中服务可以是“elasticsearch”,而任务是该elasticsearch服务的单个实例。
Docker网络
思路是为每个创建的服务分配虚拟IP(VIP)和自定义DNS别名。您可以使用“docker service inspect myservice”命令检索此VIP。
但是,有两种模式可以将服务附加到覆盖网络中:dnsrr和VIP。您可以使用“docker service create”的“--endpoint-mode”选项选择这些选项。
VIP模式(我认为它是默认模式,或者至少是最常用的模式)会影响服务的DNS别名的虚拟IP。这意味着执行“nslookup servicename”会向您返回一个VIP,在幕后,它会以轮换方式链接到您的容器之一。但是,还有一个特殊的DNS别名,可让您访问所有实例IP(所有任务IP):“tasks.myservice”。
因此,在VIP模式下,您可以使用简单的“nslookup tasks.myservice”检索所有任务IP,其中myservice是服务名称。
另一种模式是dnsrr。此模式仅摆脱VIP,并以轮换方式将DNS别名连接到不同的任务(=服务实例)。这样,您只需执行“nslookup myservice”即可检索不同的服务实例IP。
Elasticsearch集群
首先,我不太熟悉elasticsearch让您如何进行集群。从您的问题中了解到的是,运行elasticsearch二进制文件时,需要将其作为参数给出需要与之集群的其他所有节点的地址。
因此,我会创建一个自定义的Elasticsearch映像,可能基于默认库中的映像,其中我会添加一个自定义Entrypoint,首先运行一个脚本以检索其他任务IP。
我认为保持在VIP模式下适合您,因为有“tasks.myservice”DNS别名。然后,您将需要解析输出以检索任务IP(并可能删除您的IP)。然后,您将能够将它们保存在配置文件环境变量中,或将它们用作运行时选项,用于您的elasticsearch二进制文件。
编辑:要创建自定义覆盖网络,您需要使用docker network create
命令,并使用docker service create
的--network
选项。
这个答案主要基于Swarm模式网络文档。