我正在尝试在 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.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
也有关于使其serviceX.{1,2,3}
可解析并因此创建可预测主机名的讨论。¹ ² ³ ⁴ 但到目前为止,这些都没有实现,因此该解决方案仅在运行时有效。
注意:使用模板功能(如docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}
)设置主机名将使主机名在本地可预测,但其他容器无法解析。
服务间主机名解析
问题:您有多个包含不同服务的容器serviceX
,serviceY
但每个服务只有一个容器,例如:
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
。
参考: