如何使用Docker Compose在多个节点的Swarm集群上重新创build容器?

当我在Swarm集群中只有一个节点时,遇到了这个问题,当我尝试在这个节点上重新创build我的Web应用程序容器时(我想部署一个正在侦听端口80的Node.JS Web应用程序的新版本)

问题是Swarm首先停止旧的容器,但并没有将其移除 ,然后尝试创build新的容器,由于Swarm也跟踪停止的容器的端口约束,它认为在我的节点端口80上仍在使用中(被停止的容器):

Recreating 41910b0283eb_41910b0283eb_41910b0283eb_vagrant_web_1 ERROR: unable to find a node with port 80 available 

这个问题可能有两种解决scheme:

  1. 在每次部署之前,我可以执行docker-compose stopdocker-compose rm ,它会停止并删除每个正在运行的容器 – 这也将释放Swarm的端口80。
  2. 另一个解决scheme是有多个节点并放松。 当compose重新创build容器时,Swarm会自动find一个没有人使用端口80的随机节点,并在另一个节点上启动新的容器。

我可以使用解决scheme1,但我想知道如何让它工作,当我有多个节点。

我的问题与2方法是通常一个Web应用程序需要有一个修复IP我可以用于域名注册。 如果Swarm将我的Web应用程序部署到随机select的节点,那么我该如何解决这个问题?

我可以使用循环法DNS,但我不知道是否会有所帮助,因为在这种情况下,如果我的群集中有3个节点,我需要在每个节点上都有一个我的Web应用程序实例。 但是,如果是这样的话,我不会遇到同样的问题? Swarm会认为有人还在使用端口80,所以它不会find任何有80端口可用的节点。

如何解决这个问题?

我认为大部分时间在应用程序前面都有一个负载平衡器。 DNS入口指向负载均衡器,并且可以在容器停止和启动时重新进行自我configuration。

那里有几个项目可以帮助你处理docker events 。 以下是我所知道的几个: