如何正确解析 Docker Swarm 中另一个容器的 IP?(DNS)

如何正确解析 Docker Swarm 中另一个容器的 IP?(DNS)

我正在尝试在 Docker Swarm 中部署服务。我无法让容器持续连接到不同节点上的容器。

假设我正在构建一个 GlusterFS 池;我需要在每个容器中打开一个终端并将 gluster 守护进程添加到池中。我如何引用池中的其他容器?目前我正在使用 IP 地址,但如果容器死亡并重新创建怎么办?据我所知,不能保证新容器具有相同的 IP 地址。我可以使用嵌入式 DNS 服务器来引用其他容器,但我似乎只能将容器名称和容器 ID 解析为 IP 地址,如果容器死亡并重新创建,这两者都会发生变化,因此没有意义。

我不应该能够解决主机名其他容器的 IP 地址?我以为会,但事实并非如此。

有没有什么办法可以解决我的难题?(我感觉我可能完全错误地使用了服务,在这种情况下我应该在每个节点上手动创建一个容器。)

答案1

根据您的具体情况,您必须使用不同的解决方案:

服务内主机名解析

问题:您有同一服务的多个容器(/副本)serviceX,例如:

  • a1b3d130275a带有主机名的容器serviceX.1.nq4rjbae
  • 65040b1cada6带有主机名的容器serviceX.2.m9wl1f1r
  • 944704427b9e带有主机名的容器serviceX.3.3d08baql

现在,您想要从容器一 ( ) 中检索第二个 ( serviceX.2.m9wl1f1r) 和第三个 ( ) 容器的主机名。serviceX.3.3d08baqlserviceX.1.nq4rjbae

Docker 提供了一个名为容器发现使用 DNS 查询tasks.$serviceName,例如:

nslookup tasks.serviceX
[...]
Name:      tasks.serviceX
Address 1: 10.0.0.205 a1b3d130275a  (<- resolved locally by /etc/hosts)
Address 2: 10.0.0.206 serviceX.2.m9wl1f1r
Address 3: 10.0.0.207 serviceX.3.3d08baql

也有关于使其serviceX.{1,2,3}可解析并因此创建可预测主机名的讨论。¹ ² ³ ⁴ 但到目前为止,这些都没有实现,因此该解决方案仅在运行时有效。

注意:使用模板功能(如docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}})设置主机名将使主机名在本地可预测,但其他容器无法解析。

服务间主机名解析

问题:您有多个包含不同服务的容器serviceXserviceY但每个服务只有一个容器,例如:

  • a1b3d130275a带有主机名的容器serviceX.1.nq4rjbae
  • 65040b1cada6带有主机名的容器serviceY.2.m9wl1f1r

serviceX并且您想要从一个服务 ( )连接到另一个服务的容器 ( serviceY) 或反之亦然。您只需使用以下--name参数:

docker service create --name=serviceX serviceX
docker service create --name=serviceY serviceY

并且您可以依赖容器a1b3d130275a可以通过主机名解析serviceX,并且容器65040b1cada6可以通过主机名解析serviceY

参考:

相关内容