Docker Swarm 中任务的可发现性

Mar*_*rth 3 service-discovery docker docker-swarm

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

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

其次,我发现您可以设置一个环境变量,其中包含docker-compose.yml我部署到 swarm 的文件中的 TaskName docker stack deply ...

    environment:
        - NODENAME={{.Node.Hostname}}
        - NODEID={{.Node.ID}}
        - SERVICEID={{.Service.ID}}  
        - SERVICENAME={{.Service.Name}}  
        - TASKID={{.Task.ID}}
        - TASKNAME={{.Task.Name}}
Run Code Online (Sandbox Code Playgroud)

您可以从各种容器 ping $TASKNAME。但它是不可发现的,因为名称中TASKNAME=e2foobar_yada.gq7ygzvp114q2x3t99lasuowc.e6ncft2k14g9o2u4blvhns19包含的 ID 在您重新启动服务时会发生更改。

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

BMi*_*tch 7

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

由于容器可以更换,因此每次访问服务时都需要查询 DNS 列表。DNS 存在过时的风险,并且您将与故障容器或完全不同的容器通信(这就是基于 IP 的负载平衡如此流行的原因)。您还需要将自己从返回的 IP 列表中排除。