我可以将核心分配给 docker 集群容器吗?

can i assign cores to docker swarm containers?

我正在部署一个包含几个服务的堆栈文件(每个服务只有 1 个副本),我需要限制每个容器使用 CPU 个核心的不同子集。我在网上 here 发现 swarm 的堆栈文件(compose v3)不支持 cpuset。我尝试了 cpu 限制,但这只会指定 cpu 资源的百分比,而不是核心。这种情况有解决办法吗?我需要内核分配来支持软件许可限制。

是的,您可以限制 cpu 股。例如:

docker service create --limit-cpu 2 nginx

不幸的是,正如您已经发现的那样,(目前)还没有办法将任务限制在给定的核心或核心组 运行具有堆栈 and/or 服务的集群模式。

一个合理的选择是在您希望它们 运行 进入的机器上手动启动这些容器,在此过程中绕过 Swarm。因此,将您的机器用作 "plain-old" docker 守护进程并使用 --cpuset-cpus 标志。

唯一的问题是 容器,默认情况下,可以访问所有 cpus,除非它被上面提到的单个容器的标志限制。因此,您需要小心并从您的 Swarm 中排除这些节点,否则它将调度容器并使用您希望限制用于许可软件的内核。

另一种选择是 运行 支持 --cpuset-cpus 标志的旧 Swarm。因此,您可以 运行 在使用 Swarm 模式管理的 docker 舰队之上安装旧 Swarm。只需确保托管您的固定容器和 cpu-restricted 容器的机器不被 Swarm 模式访问,以下可能是一个选项,例如:

                        +-------------+
                        | Swarm Mode  |
       +----------------+   Primary   |
       |                |             |
       |                +------+------+
       |                       |
       |                       |
       |                       |                       +----------------+
       |                       |                       |  Containers    |
       |                       |                       |  with          |
       |                       |                       |  pinned cores  |
+------v------+         +------v------+         +------+------+---------+
|             |         |             |         |             |
|   Agent     |         |   Agent     |         |   Agent     |
|             |         |             |         |             |
+------+------+         +------^------+         +------^------+
       ^                       |                       |
       |                       |                       |
       |                       |                       |
       |                       |                       |
       |                       |                       |
       |                       |                       |
       |                +------+------+                |
       |                |   Swarm     |                |
       +----------------+  Primary    +----------------+
                        |             |
                        +-------------+

总而言之,目前还没有合理的解决方法,仅使用 Docker Swarm 模式。说不定以后还是有希望看到这片土地的。

另一种选择是在您的容器中使用任务集。您可以在堆栈文件中更改您的服务容器命令,以便将其包装在任务集中(您可能需要自定义图像)。 例如:taskset -c 2,3 启动脚本