Docker Swarm过滤器,约束和调度策略

时间:2019-03-23 07:28:20

标签: docker docker-swarm

我正在Windows下使用Docker,在Ubuntu上也使用docker-ce。

我启用了docker swarm模式。

  • 我遇到了许多文章,这些文章指定swarm具有不同的策略(例如装箱,传播),我们可以在docker info命令中看到它,但我看不到。

    • 本文中的某些内容还指定了不同的过滤器,例如亲和力,资源,端口和约束。我只能在docker service命令中看到约束,而在其他命令中看不到约束。

    • 我们如何才能像该服务那样仅在该节点正在运行具有特定名称的服务的节点上运行? (有很多场景,但这只是其中之一)

2 个答案:

答案 0 :(得分:0)

需要清除的几件事:

  1. 群集模式只有一种放置策略,即传播。您可能正在阅读有关“经典群”的旧文章,而Docker在2016年中发布了内置的Swarm Mode,它确实支持binpack。
  2. 有很多方法可以控制群集中的容器放置,我在See the docs on those features here(付费课程)中详细介绍了该方法,其中包括(至少)放置约束,放置首选项,全局模式和资源需求。 docker's example of supervisord
  3. 如果要确保两个服务位于同一节点上,最简单的方法是在该节点上放置“节点标签”,然后在两个服务上创建放置约束以匹配该标签。如果您希望两个节点都在第一个节点发生故障时一起故障转移到另一个节点,则这可能不是一个好主意。 Swarm没有像Kubernetes这样的“ pod”概念,因此它没有一种简单的方法来确保两个容器始终在一个节点上。对我来说,对于php-fpm + nginx或codefusion + nginx之类的东西,我将它们放在单个图像中,并使用{{3}}使其保持在一起。

答案 1 :(得分:0)

如上所述,“新”泊坞窗群模式没有诸如亲和力之类的内置概念。解决方法是,您可以使用标签,但如前所述,通常这会导致故障转移。

我遇到了类似的问题,并创建了一个“自动标签”程序,该程序可检测正在运行的服务/任务并相应地设置节点标签,以使其在启动/停止时保持更新。然后,您可以使用节点标签,而不会失去故障转移功能。

请参阅以下docker存储库:davideshay/dockerautolabel

可在github上找到源代码:https://github.com/davideshay/dockerautolabel

也在寻找反馈来改进。