重新启动Docker群组堆栈中的一个服务

esbemjvw  于 2022-11-22  发布在  Docker
关注(0)|答案(6)|浏览(314)

有没有人知道有没有一种方法可以让docker swarm重新启动一个服务,这个服务是堆栈的一部分,而不需要重新启动整个堆栈?

ioekq8ef

ioekq8ef1#

对我来说再次做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标志将强制服务更新,从而导致服务重新启动。

g9icjywg

g9icjywg2#

缩放到0并备份:

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

bnl4lu3b3#

查看docker stack文档:

扩展说明

从群组上的compose或dab文件创建并更新堆栈
this blog article开始:docker stack的工作方式与docker compose类似。它是幂等的。如果堆栈已经部署,docker stack deploy将只重新启动那些具有更新的摘要或标记的服务:

根据我的经验,当我再次部署同一堆栈时,如果一个服务发生了变化,只有更新的服务会重新启动

**但是...**考虑到的更改似乎有一些限制(一些报告bugs with image tags),因此给予一下,看看是否如预期那样工作。

如果您要确保只有目标服务才更新您的更改,也可以使用service update
You can also refer to this similar SO QA

2w3rbyxf

2w3rbyxf4#

documentation中滚动更新的示例所示:
$ docker服务更新--图像redis:3.0.7 redis
但是,只有当你的镜像已经在本地机器上时,这才有效。如果没有,你需要使用--with-registry-auth来发送注册表验证细节到swarm代理。详情请参阅docker service update documentation.
$ docker服务更新--使用注册表验证--图像

h7appiyu

h7appiyu5#

要在已配置的现有堆栈中重新启动单个服务(如果服务具有多个副本,则使用滚动重新启动来避免停机),您可以执行以下操作:

docker service update --force stack_service_name

我不建议再次运行同一个命令(在另一个shell中),直到这个命令完成(因为否则不能保证滚动重启;它可能重新启动该服务的所有复制品)。
docker service update命令也会检查您尝试使用的image:tag的更新版本。如果您的注册表需要auth,也要传递--with-registry-auth参数,如下所示:

docker service update --force --with-registry-auth stack_service_name

如果不传递此参数,服务仍将重新启动,但不会进行检查,并且服务仍将使用旧的容器映像,而不会首先提取新的容器映像。这可能是您所希望的。
如果你还想切换到不同的图像标签(或者完全不同的图像),你也可以从这里进行,但是记住也要改变你的docker-stack.yml中的标签,否则你的下一个docker stack deploy将把它恢复到那里定义的版本:

docker service update --with-registry-auth --force --image nginx:edge stack_service_name
pxy2qtax

pxy2qtax6#

删除它:

docker stack rm stack_name

重新部署:

docker stack deploy -c docker-compose.yml stack_name

相关问题