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

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

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

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

但是,当我与其他容器一起运行容器时,其他容器将放置在同一个节点上。 我怎样才能确保Docker给这个容器提供最低级别的CPU和RAM?

更新

我添加了reservations @yamenkbuild议,但是我仍然得到其他容器开始在同一个节点,导致性能问题,我试图保护的容器:

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

更新

显然, Docker群中的内存保留的效果并不是很好的logging,他们作为一个最好的努力。 要了解内存预留标志的效果,请查看文档 :

当设置了内存预留时,Docker将检测内存争用或内存不足,并迫使容器限制其使用量达到预留限制。

内存预留是一个软限制function,并不保证不会超出限制。 相反,该function会尝试确保当内存严重竞争时,会根据预留提示/设置来分配内存。

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

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

 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