如何在Swarm模式下停止/启动Docker容器而不删除?

10

我是docker swarm模式的新手。正如您所知,可以启动/停止docker容器,但我发现在swarm中没有这样的可能性。
例如,我已经部署了swarm并创建了新的任务,并且使用副本(2/2):

docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                                                                               PORTS
2o3a6z30q9df        contactactivity     replicated          2/2                 myimage/live-springboot-myservice:19ff0be1f0087asd1dasdb52c345151e9985b4a5a2   *:111->1111/tcp

有没有可能停止一个集群容器,而不是将其删除,并在将来将其重新引入?

附言:我只想澄清,在我的情况下,删除或重新创建不是选择。

为了让 Q 清晰明了: 如果您停止容器,然后启动 - 此容器将不再是集群的一部分。我无法相信在集群模式下没有简单的重启或启动/停止方式。


你不能相信的是,对于Swarm来说,完全正确的做法就是这样。Docker容器用于不可变式基础架构,如果一个容器死了,那也没关系。因为Swarm会杀掉它并启动一个新的容器。如果不是这种情况,当出现问题时系统就无法保持健康。如果你期望一个容器被停止并重新使用,那么你就没有正确地使用Docker类比。 - Tarun Lalwani
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
问题是“是否可以停止Swarm容器中的一个而不删除它,并在未来将其重新启动?”,这确实是与开发有关的问题。 正如我所回答的正确答案是“不行”,Swarm并没有设计为允许这样做。虽然有一些解决方法,但它们都是最糟糕的做法。 - mrq
3个回答

8

列出运行中的服务容器并停止它们,例如使用以下命令:

docker ps | grep service-name

然后通过上述命令中的 docker stop <ID> 命令来停止容器。

                                 OR

如果您想停止所有容器,只需将服务缩减到0,如下所示:

docker service scale servicename=0

通过以下命令将它们重新启动:

docker service scale servicename=N

是的,“停止”可以起作用,但这将使未来无法启动它。扩展将删除所有容器,这在生产环境中不是一个好的解决方案。 - Sergey Gorshkov
是的,它会启动,但不会成为群集的一部分。 - Sergey Gorshkov
1
Docker Swarm Join 处理将新的工作节点添加到群集中,而不是将独立的 Docker 容器重新连接到 Swarm。 - Toddinpal
2
执行 docker service scale servicename=0 会删除数据! - Captain Levi
1
这个答案完全是错误的。
  1. 直接停止和启动容器会将其从服务中移除,在大多数情况下变得无用,实际上这不是像问题所问的那样在"swarm"中完成的。
  2. 将服务缩放到零,然后再缩放到(N=)1并不会“恢复”容器,而是创建一个全新的容器,因此在这种情况下也没有“启动/停止”。
- mrq
显示剩余2条评论

1
不,这是不可能的“开箱即用”,即使您设法以某种困难的方式实现,也会与Docker Swarm方法完全相反。
您正在尝试执行的步骤是典型的(手动)操作步骤:使用Swarm将此类操作要求交给编排器(UCP,管理节点中的逻辑)。
Swarm每次决定启动新任务(容器实例)时都会启动一个全新的引导容器。这有两个后果,符合Docker最佳实践,并且也许可以一起解决您的问题:
- 您希望容器尽快启动 - 如果容器内部有您担心丢失或需要长时间创建/收集的内容,请将其持久化到容器外部(例如,在共享的Docker卷中,在新创建的容器启动时会发现它已准备好)

0

我自己也觉得很奇怪,但显然docker swarm想要的方法是删除服务,然后从堆栈或命令行重新部署它。此外,如果服务是全局的,并且具有失败重启策略,容器被杀死时将存在两个实例(但如果它被优雅地停止,则不会出现这种情况)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接