Docker 如何通过领事和gliderlabs/registrator防止僵尸服务?

Docker 如何通过领事和gliderlabs/registrator防止僵尸服务?,docker,load-balancing,service-discovery,consul,Docker,Load Balancing,Service Discovery,Consul,我正在使用Concur和gliderlabs/registrator容器来显示我在Concur中的活动容器。当我删除容器的速度过快时,该服务不会从Consor中删除,留下不再存在的“僵尸”服务。我听说gliderlabs/registrator容器可以使用一些额外的选项来防止这种情况,例如-cleanup。但是,我无法使用此选项成功运行任何注册程序。这是我当前针对注册者的docker运行命令: docker run -d -h $(hostname -i) --name registrator1

我正在使用Concur和gliderlabs/registrator容器来显示我在Concur中的活动容器。当我删除容器的速度过快时,该服务不会从Consor中删除,留下不再存在的“僵尸”服务。我听说gliderlabs/registrator容器可以使用一些额外的选项来防止这种情况,例如
-cleanup
。但是,我无法使用此选项成功运行任何注册程序。这是我当前针对注册者的docker运行命令:

docker run -d -h $(hostname -i) --name registrator1 \
-v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \
consul://$(hostname -i):8500
我必须向这个run命令添加什么才能注册或从concur中删除任何不再存在或已关闭的容器

更新:我发现了问题

所以我使用我的领事集群和注册者集群运行swarm。为了为swarm提供故障切换,我在我的Consor群集前面放置了一个负载平衡器,并将我的swarm和registrator容器连接到负载平衡器的IP地址。这使得任何执政官节点都可以在不丢失swarm的情况下下降

但是swarm不将自己注册为服务。它将每个节点注册为键值,并且不绑定到Consor集群中的任何节点。使用registrator注册到Concur的容器作为服务创建,并绑定到单个Concur服务器

我想发生的是,当我删除一个容器时,注册者会去从consor删除服务,但它只有33%的机会命中正确的consor服务器并删除该服务,因为我的LB只是循环

我所有的swarm masters、负载均衡器、Concur服务器和swarm Worker都在不同的机器上运行。我的注册者在我的swarm worker机器上运行。一切都在容器中运行


启用粘性负载平衡是解决我的问题的临时解决方案。然而,我认为尝试在我的swarm workers上运行某种类型的Consour workers,并让registrator绑定到本地主机上运行的Consour可能是解决方案。我相信这可能就是领事github中描述的“板凳工人”。我对Concur还是一个新手,所以我仍在努力解决这个问题。

答案是在我所有的swarm worker节点上运行Concur workers,正式名称为Concur Client。这可以通过从我的progrium/concur运行命令中删除
-server
标记来实现。然后,我的注册者只是向每台机器上运行的concur客户端报告,而不是将自己绑定到concur服务器。由于progrium/Concur已过时且不再维护,因此当容器意外停止(即除
docker stop
之外的任何方式)并随后移除时,仍然会出现僵尸问题

答案是在我的所有swarm worker节点上运行concur workers,正式名称为concur clients。这可以通过从我的progrium/concur运行命令中删除
-server
标记来实现。然后,我的注册者只是向每台机器上运行的concur客户端报告,而不是将自己绑定到concur服务器。由于progrium/Concur已过时且不再维护,因此当容器意外停止(即除
docker stop
之外的任何方式)并随后移除时,仍然会出现僵尸问题