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

Muh*_*eed 5 system-requirements docker docker-compose docker-swarm

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

my-service
  image: hello-world
  deploy:
    resources:
      limits:
        cpus: '2'
        memory: 4GB
Run Code Online (Sandbox Code Playgroud)

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

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

更新

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

my-service
  image: hello-world
  deploy:
    resources:
      reservations:
        cpus: '2'
        memory: 4GB
Run Code Online (Sandbox Code Playgroud)

yam*_*enk 3

更新

\n\n

显然, docker swarm中内存预留的效果没有得到很好的记录,并且它们已尽力工作。要了解内存预留标志的作用,请查看文档

\n\n
\n

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

\n\n

...

\n\n

内存预留是一项软限制功能,不保证不会超过该限制。相反,该功能尝试确保当内存竞争激烈时,根据预留提示/设置分配内存。

\n
\n\n

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

\n\n

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

\n\n
docker node update --label-add hello-world=yes <node-name>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
my-service:\n  image: hello-world\n  deploy:\n    placement:\n      constraints:\n        - node.labels.hello-world == yes\n\nother-service:\n  ...\n  deploy:\n    placement:\n      constraints:\n        - node.labels.hello-world == no\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
my-service:\n  image: hello-world\n  deploy:\n    mode: global\n    placement:\n      constraints:\n        - node.labels.hello-world == yes\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

旧答案:

\n\n

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

\n\n
version: \'3\'\nservices:\n  redis:\n    image: redis:alpine\n    deploy:\n      resources:\n        reservations:\n          cpus: \'1\'\n          memory: 20M\n
Run Code Online (Sandbox Code Playgroud)\n