如何使用 Docker Swarm 设置最低容器要求

How to Set Minimum Container Requirements Using Docker Swarm

在 Docker Swarm 中,您可以像这样设置最大系统要求:

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

我有一个容器,其最低系统要求为 2 CPU 个内核和 4GB RAM,这与我的 Docker Swarm 中的节点大小完全相同。这意味着当此容器 运行ning 时,它需要是该节点上唯一的容器 运行ning。

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

更新

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

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

更新

显然,docker swarm 中内存预留的效果没有很好的记录,它们是尽力而为。要了解内存预留标志的作用,请查看 documentation:

When memory reservation is set, Docker detects memory contention or low memory and forces containers to restrict their consumption to a reservation limit.

...

Memory reservation is a soft-limit feature and does not guarantee the limit won’t be exceeded. Instead, the feature attempts to ensure that, when memory is heavily contended for, memory is allocated based on the reservation hints/setup.

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

如所述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的副本,并且每个节点上仍然有一个容器运行ning,你需要设置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