Docker Swarm 中任务的可发现性

Discoverabilty of Tasks in Docker Swarm

我是 运行 一个小型 Docker Swarm 运行 具有 2 个副本的服务。 在该服务中,该服务的 "task-1" 需要与同一服务的 "task-2" 通信,但我找不到实现此目的的方法

首先,我想避免在主机网络模式下设置服务,因为这样将它放入 swarm 中就没有什么意义了。

其次,我发现您可以在 docker-compose.yml 文件中设置一个包含 TaskName 的环境变量,我使用 docker stack deply ...:

部署到 swarm
    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 在您重新启动服务时会发生变化。

我可以设置别名吗?有什么方法可以让我进行任务通信吗?

您可以 运行 在 tasks.$servicename 上进行 DNS 查找,其中 $servicename 是您的服务名称。它将解析为指向服务中每个任务的 ip 列表。它是为 swarm 模式实现的 DNS-RR,以支持无法通过内置基于 IP 的 RR 负载平衡器的进程。

您每次访问服务时都需要查询 DNS 列表,因为可以更换容器。存在 DNS 变得陈旧的风险,您将与一个宕机的容器或一个完全不同的容器通信(这就是为什么基于 IP 的负载平衡如此受欢迎的原因)。并且您还需要将自己从返回的 IP 列表中排除。

我想一个解决方法是为每个服务初始化不同的服务,并使用唯一的名称 - web_1、web_2、.. web_N。 (即使他们使用相同的图片)