重新启动docker swarm堆栈中的一项服务


Answers:


108

这样做docker stack deploy对我来说又是去更新服务的方式。作为Francois的Answer,根据我自己的经验,这样做只会更新需要更新的服务。

但是有时,在测试内容时仅重新启动单个服务似乎更容易。就我而言,我必须清除该卷并更新该服务以启动它,就像它是新鲜的一样。我不确定我要描述的方法是否有缺点。我在开发堆栈上对其进行了测试,它对我来说非常有用。

获取您要拆除的服务ID,然后用于docker service update --force <id>强制更新该服务,从而有效地重新部署该服务

$ docker stack services <stack_name>
ID                  NAME              ...
3xrdy2c7pfm3        stack-name_api    ...

$ docker service update --force 3xrdy2c7pfm3

--force标志将强制服务进行更新,导致其重新启动。


68

缩放到0并备份:

docker service scale myservice=0
docker service scale myservice=10

2
这是实际上强制重新启动的唯一命令。谢谢!
the_ccalderon'1

1
同意,只是强迫更新没有为我重新启动服务,不知道为什么
Egor

尽管此方法似乎确实停止了服务,但不知何故,服务仍然潜伏在野兽的肠腔中。例如,当我缩减服务规模并尝试旋转另一个使用相同端口的端口时,我会得到“端口已在使用中”。
netlander

14

查看docker stack文档:

扩展说明

从群集上的compose或dab文件创建和更新堆栈

摘自这篇博客文章docker stackdocker compose。这是幂等的。如果已经部署了堆栈,docker stack deploy则将仅重新启动具有摘要或标记已更新的那些服务:

码头工人堆栈过程

根据我的经验,当我在更改一项服务的情况下再次部署同一堆栈时,只会重新启动更新的服务

但是...考虑到的更改似乎有一些限制(某些带有图像标签的报告错误),因此请尝试一下,看看是否能按预期工作。

service update如果您要确保仅针对目标服务进行了更改更新,则也可以使用。

您也可以参考类似的SO QA


谢谢,这确实按预期工作。我实际上正在寻求以滚动方式强制重新启动一项特定服务(或整个堆栈)。不幸的是,我处理的某些服务在缓存失效方面存在问题,我们发现我们需要删除/重新部署堆栈以强制进行更新。查看service update文档env,如果没有内置的方式,我可以添加/删除变量以伪造出来。
tweeks200 '17年

只是在寻找同一件事-在文档中找不到任何东西。
Morgan Kobeissi

我只是遇到以下问题:docker stack deploy无法启动服务(openldap)。我找不到日志文件。docker-compose run <service>会毫无问题地启动容器。最后,docker service update --force <servce>做了工作。
rhoerbe

0

按照用于滚动更新的文档中的示例:

$ docker服务更新--image redis:3.0.7 redis

但是,仅当您的映像已经在本地计算机上时,这才起作用。如果不是,则需要使用--with-registry-auth将注册表身份验证详细信息发送到swarm代理。请参阅docker服务更新文档中的详细信息

$ docker服务更新--with-registry-auth --image redis:3.0.7 redis


-1

去掉它:

docker stack rm stack_name

重新部署:

docker stack deploy -c docker-compose.yml stack_name

上面公认的答案有效且有效地解决了停机时间
tweeks200 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.