有没有人知道有没有一种方法可以让docker swarm重新启动一个服务,这个服务是堆栈的一部分,而不需要重新启动整个堆栈?
ioekq8ef1#
对我来说再次做docker stack deploy是更新服务的方法,作为Francois' Answer,也是根据我自己的经验,这样做只更新需要更新的服务。但有时候,在测试的时候,只重启一个服务似乎更容易。在我的例子中,我不得不清除卷并更新服务来启动它,就像它是新鲜的一样。我不确定我将要描述的方法是否有缺点。我在我的开发堆栈上测试了它,它对我来说效果很好。获取要删除的服务ID,然后使用docker service update --force <id>强制更新服务,从而有效地重新部署服务
docker stack deploy
docker service update --force <id>
$ docker stack services <stack_name> ID NAME ... 3xrdy2c7pfm3 stack-name_api ... $ docker service update --force 3xrdy2c7pfm3
--force标志将强制服务更新,从而导致服务重新启动。
--force
g9icjywg2#
缩放到0并备份:
docker service scale myservice=0 docker service scale myservice=10
bnl4lu3b3#
查看docker stack文档:
docker stack
扩展说明
从群组上的compose或dab文件创建并更新堆栈从this blog article开始:docker stack的工作方式与docker compose类似。它是幂等的。如果堆栈已经部署,docker stack deploy将只重新启动那些具有更新的摘要或标记的服务:
docker compose
根据我的经验,当我再次部署同一堆栈时,如果一个服务发生了变化,只有更新的服务会重新启动。
**但是...**考虑到的更改似乎有一些限制(一些报告bugs with image tags),因此给予一下,看看是否如预期那样工作。
如果您要确保只有目标服务才更新您的更改,也可以使用service update。You can also refer to this similar SO QA。
service update
2w3rbyxf4#
如documentation中滚动更新的示例所示:$ docker服务更新--图像redis:3.0.7 redis但是,只有当你的镜像已经在本地机器上时,这才有效。如果没有,你需要使用--with-registry-auth来发送注册表验证细节到swarm代理。详情请参阅docker service update documentation.$ docker服务更新--使用注册表验证--图像
h7appiyu5#
要在已配置的现有堆栈中重新启动单个服务(如果服务具有多个副本,则使用滚动重新启动来避免停机),您可以执行以下操作:
docker service update --force stack_service_name
我不建议再次运行同一个命令(在另一个shell中),直到这个命令完成(因为否则不能保证滚动重启;它可能重新启动该服务的所有复制品)。docker service update命令也会检查您尝试使用的image:tag的更新版本。如果您的注册表需要auth,也要传递--with-registry-auth参数,如下所示:
docker service update
--with-registry-auth
docker service update --force --with-registry-auth stack_service_name
如果不传递此参数,服务仍将重新启动,但不会进行检查,并且服务仍将使用旧的容器映像,而不会首先提取新的容器映像。这可能是您所希望的。如果你还想切换到不同的图像标签(或者完全不同的图像),你也可以从这里进行,但是记住也要改变你的docker-stack.yml中的标签,否则你的下一个docker stack deploy将把它恢复到那里定义的版本:
docker-stack.yml
docker service update --with-registry-auth --force --image nginx:edge stack_service_name
pxy2qtax6#
删除它:
docker stack rm stack_name
重新部署:
docker stack deploy -c docker-compose.yml stack_name
6条答案
按热度按时间ioekq8ef1#
对我来说再次做
docker stack deploy
是更新服务的方法,作为Francois' Answer,也是根据我自己的经验,这样做只更新需要更新的服务。但有时候,在测试的时候,只重启一个服务似乎更容易。在我的例子中,我不得不清除卷并更新服务来启动它,就像它是新鲜的一样。我不确定我将要描述的方法是否有缺点。我在我的开发堆栈上测试了它,它对我来说效果很好。
获取要删除的服务ID,然后使用
docker service update --force <id>
强制更新服务,从而有效地重新部署服务--force
标志将强制服务更新,从而导致服务重新启动。g9icjywg2#
缩放到0并备份:
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。
2w3rbyxf4#
如documentation中滚动更新的示例所示:
$ docker服务更新--图像redis:3.0.7 redis
但是,只有当你的镜像已经在本地机器上时,这才有效。如果没有,你需要使用--with-registry-auth来发送注册表验证细节到swarm代理。详情请参阅docker service update documentation.
$ docker服务更新--使用注册表验证--图像
h7appiyu5#
要在已配置的现有堆栈中重新启动单个服务(如果服务具有多个副本,则使用滚动重新启动来避免停机),您可以执行以下操作:
我不建议再次运行同一个命令(在另一个shell中),直到这个命令完成(因为否则不能保证滚动重启;它可能重新启动该服务的所有复制品)。
docker service update
命令也会检查您尝试使用的image:tag的更新版本。如果您的注册表需要auth,也要传递--with-registry-auth
参数,如下所示:如果不传递此参数,服务仍将重新启动,但不会进行检查,并且服务仍将使用旧的容器映像,而不会首先提取新的容器映像。这可能是您所希望的。
如果你还想切换到不同的图像标签(或者完全不同的图像),你也可以从这里进行,但是记住也要改变你的
docker-stack.yml
中的标签,否则你的下一个docker stack deploy
将把它恢复到那里定义的版本:pxy2qtax6#
删除它:
重新部署: