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。
(即使他们使用相同的图片)
我是 运行 一个小型 Docker Swarm 运行 具有 2 个副本的服务。 在该服务中,该服务的 "task-1" 需要与同一服务的 "task-2" 通信,但我找不到实现此目的的方法
首先,我想避免在主机网络模式下设置服务,因为这样将它放入 swarm 中就没有什么意义了。
其次,我发现您可以在 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 在您重新启动服务时会发生变化。
我可以设置别名吗?有什么方法可以让我进行任务通信吗?
您可以 运行 在 tasks.$servicename
上进行 DNS 查找,其中 $servicename
是您的服务名称。它将解析为指向服务中每个任务的 ip 列表。它是为 swarm 模式实现的 DNS-RR,以支持无法通过内置基于 IP 的 RR 负载平衡器的进程。
您每次访问服务时都需要查询 DNS 列表,因为可以更换容器。存在 DNS 变得陈旧的风险,您将与一个宕机的容器或一个完全不同的容器通信(这就是为什么基于 IP 的负载平衡如此受欢迎的原因)。并且您还需要将自己从返回的 IP 列表中排除。
我想一个解决方法是为每个服务初始化不同的服务,并使用唯一的名称 - web_1、web_2、.. web_N。 (即使他们使用相同的图片)