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

Hub*_*bro 10 networking dns docker docker-swarm

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

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

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

我的难题有什么解决方案吗?(我觉得我可能会错误地使用服务,在这种情况下,我应该在每个节点上手动创建一个容器。)

Mur*_*mel 10

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

服务内主机名解析

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

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

现在,您要从容器一 ( ) 中检索第二个 ( serviceX.2.m9wl1f1r) 和第三个 ( serviceX.3.3d08baql) 容器的主机名serviceX.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
Run Code Online (Sandbox Code Playgroud)

还有关于使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
Run Code Online (Sandbox Code Playgroud)

你可以依靠该容器a1b3d130275a将是主机名解析serviceX和容器65040b1cada6的主机名serviceY

参考: