如何使用Docker Swarm设置最小容器需求

时间:2017-09-20 10:07:05

标签: docker docker-compose docker-swarm system-requirements

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

smsID

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

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

更新

我按照@yamenk的建议添加了my-service image: hello-world deploy: resources: limits: cpus: '2' memory: 4GB ,但是我仍然在同一节点上启动其他容器,这会导致我试图保护的容器出现性能问题:

reservations

1 个答案:

答案 0 :(得分:3)

<强>更新

显然, docker swarm 中的内存预留效果并未得到很好的记录,并且它们可以尽力而为。要了解内存预留标志的影响,请查看documentation

  

设置内存预留时,Docker会检测内存争用或   低内存并强制容器限制他们的消费   预订限额。

     

...

     

内存预留是一项软限制功能,但不保证   不会超过限额。相反,该功能试图确保   当内存严重争用时,内存是基于分配的   在预订提示/设置。

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

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

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