【问题标题】:Restart one service in docker swarm stack重新启动 docker swarm 堆栈中的一项服务
【发布时间】:2017-12-02 08:57:06
【问题描述】:

有谁知道是否有办法让 docker swarm 重新启动作为堆栈一部分的一项服务,而无需重新启动整个堆栈?

【问题讨论】:

    标签: docker docker-compose docker-swarm


    【解决方案1】:

    为我再次执行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 标志将强制更新服务,导致它重新启动。

    【讨论】:

    • docker service update --force &lt;id&gt; 解决方案是否强制再次读取堆栈/撰写文件?我之所以这样问,是因为我确实想在部署完整堆栈后覆盖服务容器入口点,但仅重新启动单个服务!
    • 它不会更新在工作节点上运行的容器。但是,它只在管理节点上更新容器。
    • 好的,如果我在每个节点上运行相同的命令也不行?
    • 无法与 promiethus 再次读取其配置文件 yml
    【解决方案2】:

    缩放到 0 并备份:

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

    【讨论】:

    • 这个是唯一真正强制重启的。谢谢!
    • 同意,只是强制更新并没有为我重启服务,不知道为什么
    • 虽然这种方法似乎确实停止了服务,但不知何故,服务仍然潜伏在野兽的深处。例如,当我缩小服务规模并尝试启动另一个使用相同端口的服务时,我得到“端口已在使用”。
    • 这不会重新启动服务 - 重新启动是指服务再次读取其配置 - 我在 prometheus 上进行了测试,但没有工作
    【解决方案3】:

    查看docker stack 文档:

    扩展说明

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

    来自this blog articledocker stack 的工作方式与docker compose 类似。它是幂等的。如果堆栈已经部署,docker stack deploy 将仅重新启动那些具有更新的摘要或标记的服务:

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

    但是...考虑到的更改似乎有一些限制(一些报告 bugs with image tags),所以请尝试一下,看看是否按预期工作。

    如果您想确保仅针对您的更改进行更新,您也可以使用service update

    You can also refer to this similar SO QA.

    【讨论】:

    • 谢谢,这确实按预期工作。我实际上希望以滚动方式强制重启一项特定服务(或整个堆栈)。不幸的是,我处理的一些服务存在缓存失效问题,我们发现我们需要删除/重新部署到堆栈以强制更新。查看service update 文档,如果没有内置方法,我可以添加/删除env 变量来伪造它。
    • 只是在寻找相同的东西 - 在文档中找不到任何东西。
    • 我刚刚遇到以下问题:docker stack deploy 不会启动服务(openldap)。我找不到日志文件。 docker-compose run &lt;service&gt; 将毫无问题地启动容器。最后,docker service update --force &lt;servce&gt;确实工作了。
    【解决方案4】:

    根据documentation 中的示例进行滚动更新:

    $ docker service update --image redis:3.0.7 redis

    但是,只有当您的图像已经在本地计算机上时,这才有效。如果没有,那么您需要使用 --with-registry-auth 将注册表身份验证详细信息发送到 swarm 代理。详情见docker service update documentation.

    $ docker service update --with-registry-auth --image redis:3.0.7 redis

    【讨论】:

      【解决方案5】:

      删除它:

      docker stack rm stack_name
      

      重新部署它:

      docker stack deploy -c docker-compose.yml stack_name
      

      【讨论】:

      • 以上接受的答案有效,并且以滚动方式执行以避免停机
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多