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

我可以将核心分配给docker swarm容器吗?,docker,docker-compose,docker-swarm,docker-swarm-mode,Docker,Docker Compose,Docker Swarm,Docker Swarm Mode,我正在部署一个包含两个服务的堆栈文件(每个服务只有一个副本),我需要限制每个容器使用不同的CPU核心子集。我在网上发现swarm的堆栈文件(compose v3)不支持cpuset。我尝试了cpu限制,但这将只指定cpu资源的百分比,而不是内核。这个案子有解决办法吗?我需要核心分配来支持软件许可限制 是的,您可以限制cpu共享。例: docker service create --limit-cpu 2 nginx 不幸的是,正如您已经发现的那样,没有办法(目前)将任务限制在一个给定的内核或一

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

是的,您可以限制cpu共享。例:

docker service create --limit-cpu 2 nginx

不幸的是,正如您已经发现的那样,没有办法(目前)将任务限制在一个给定的内核或一组运行swarm模式的内核上,该内核具有堆栈和/或服务

一个合理的选择是在您希望它们运行的机器上手动启动这些容器,在过程中绕过Swarm。因此,将您的计算机用作“普通的旧”docker守护进程,并使用
--cpuset CPU
标志

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

另一个选项是运行支持
--cpusetcpus
标志的旧版本。所以你可以在你的docker车队上运行一个用Swarm模式管理的旧Swarm。只需确保承载固定容器和cpu受限容器的计算机未通过Swarm模式访问,例如,以下可能是一个选项:

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

总之,目前仅使用Docker Swarm模式没有合理的解决办法。将来可能仍有希望看到这片土地。

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