5

在 Docker Swarm 中,您可以设置最大系统要求,如下所示:

my-service
  image: hello-world
  deploy:
    resources:
      limits:
        cpus: '2'
        memory: 4GB

我有一个容器,它的最低系统要求是 2 个 CPU 内核和 4GB 的 RAM,这是我的 Docker Swarm 中节点的确切大小。这意味着当该容器运行时,它必须是该节点上运行的唯一容器。

但是,当我与其他容器一起运行容器时,其他容器会放置在同一个节点上。如何确保 Docker 为该容器提供最低级别的 CPU 和 RAM?

更新

reservations按照@yamenk 的建议添加了,但是我仍然让其他容器在同一个节点上启动,这会导致我试图保护的容器出现性能问题:

my-service
  image: hello-world
  deploy:
    resources:
      reservations:
        cpus: '2'
        memory: 4GB
4

1 回答 1

3

更新

显然, docker swarm中的内存保留效果并没有很好的记录,它们尽了最大努力。要了解内存预留标志的效果,请查看文档

设置内存预留后,Docker 会检测内存争用或内存不足,并强制容器将其消耗限制在预留限制内。

...

内存预留是一种软限制功能,不保证不会超过限制。相反,该功能试图确保当内存被大量争用时,内存是根据预留提示/设置分配的。

要强制没有其他容器在同一节点上运行,您需要设置服务约束。您可以做的是给集群中的节点特定标签,并使用这些标签来安排服务仅在具有这些特定标签的节点上运行。

如此所述,可以使用以下命令将节点标签添加到节点:

docker node update --label-add hello-world=yes <node-name>

然后在您的堆栈文件中,您可以限制容器仅在具有指定标签的节点上运行,而其他容器则避免使用hello-world=yes.

my-service:
  image: hello-world
  deploy:
    placement:
      constraints:
        - node.labels.hello-world == yes

other-service:
  ...
  deploy:
    placement:
      constraints:
        - node.labels.hello-world == no

如果要在多个节点上启动 my-service 的副本,并且每个节点上仍然运行一个容器,则需要设置 my-service 的全局模式,并在要运行容器的节点上添加相同的标签.

全局模式确保只有一个容器将运行满足服务约束的每个节点:

my-service:
  image: hello-world
  deploy:
    mode: global
    placement:
      constraints:
        - node.labels.hello-world == yes

老答案:

您可以这样设置资源预留:

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        reservations:
          cpus: '1'
          memory: 20M
于 2017-09-20T10:43:48.743 回答