我正在使用 Docker 17.03 -ee 版本
我必须动态创建一个具有可变内存量和可变数量的 CPU 的 docker 容器,并且此硬件不应在容器之间共享。
举个例子,让我们考虑我有
具有 8GB 内存和 4 个内核的主机。
创建具有 3GB 内存和 1 个 CPU 的 docker 容器 (d1( 创建具有 5GB 内存和 3 个 CPU 的 docker 容器 (d2( 创建具有 2GB 内存和 2 个 CPU 的 docker contianer (d3( 我注意到 docker run 需要 -m 标志,我可以使用它设置内存限制,它还有 --cpuset-cpus,我可以使用它为我的容器分配特定的 CPU
内核。
我能够使用上述标志创建 d1 和 d2。在创建时,我观察到我必须采用核心管理的核心,即我必须维护带有容器的核心分配。
我可以只提供内核数量并自动处理内核分配吗?
创建d1 和 d2 后,由于我已经用完了所有可用内存和 cpuset,因此不应允许我创建更多容器。
但是,如果我尝试创建一个内存为 4GB 的容器 d3,我就能成功创建它。
如何在不与其他容器共享该内存的情况下将该内存分配给该特定容器?
是否有任何已经构建的解决方案负责管理分配有容器的内存和分配有容器的 CPU 内核?还是我必须自己维护此信息并确保在所有内存或内核用完时不应创建新容器?
从 docker 1.13 开始,您可以使用--cpus
这可能是您正在寻找的。在 1.13 之前,您必须使用--cpu-period
和--cpu-quota
,--cpus
实际上是它们的帮手。
将容器限制为仅使用 1 个内核:--cpus=1.0
、2 个内核--cpus=2.0
等,也允许使用分数。但请注意,--cpus
和--cpuset-cpus
都不会保留这些 CPU。它只是限制可以使用多少 CPU(或哪些内核(,但它不能禁止任何其他容器/进程使用相同的资源。
情况与记忆(--memory
(相似。您可以声明最大限制,容器根本无法分配超过限制的资源。但它不会以任何方式保留或"预分配"内存。
如果你正在寻找一种强制这种行为的方法,你应该研究容器编排解决方案,如kubernetes,openshift,docker swarm等。这些解决方案是专门为在集群中轻松分发容器而创建的,同时考虑集群总资源。然后,您可以简单地指定,例如:容器 X 最多应使用 2 个内核,最大 500MB 内存并具有 2 个副本。如果您的集群没有足够的资源,容器将简单地保留为挂起状态。