我正在运行一个小型Docker Swarm,运行的服务具有2个副本。 在该服务中,该服务的“任务1”需要与同一服务的“任务2”对话,但是我找不到实现此目的的方法
首先,我要避免将服务设置为“主机联网模式”,因为那样一来,将其放入集群就没有多大意义了。
第二,我发现可以在docker-compose.yml
文件中设置一个包含TaskName的环境变量,该文件是通过docker stack deply ...
部署到群中的:
environment:
- NODENAME={{.Node.Hostname}}
- NODEID={{.Node.ID}}
- SERVICEID={{.Service.ID}}
- SERVICENAME={{.Service.Name}}
- TASKID={{.Task.ID}}
- TASKNAME={{.Task.Name}}
您可以从各种容器中ping $ TASKNAME。但这是无法发现的,因为名称TASKNAME=e2foobar_yada.gq7ygzvp114q2x3t99lasuowc.e6ncft2k14g9o2u4blvhns19
包含重新启动服务时正在更改的ID。
我可以设置别名吗,或者有什么方法可以让我进行任务沟通?
答案 0 :(得分:1)
您可以在tasks.$servicename
上运行DNS查找,其中$servicename
是服务的名称。它将解析为指向服务中每个任务的ip列表。 DNS-RR是为群模式实现的,以支持无法通过基于IP的内置RR负载均衡器进行的进程。
由于可以替换容器,因此每次访问服务时都需要查询DNS列表。 DNS可能会过时,您将与关闭的容器或完全不同的容器交谈(这就是为什么基于IP的负载平衡如此受欢迎的原因)。而且,您还需要将自己排除在返回的IP列表之外。
答案 1 :(得分:0)
我想一种解决方法可能是使用唯一的名称为每个服务初始化不同的服务 - web_1、web_2、.. web_N。 (即使他们使用相同的图像)