我正在使用Docker 17.03 -ee版本
我必须动态创建一个具有可变内存量和可变数量cpus的docker容器,并且不应在容器之间共享此硬件。
举个例子,让我们考虑一下
主机,内存为8GB,内核为4个 创建一个3GB内存和1个cpus的docker容器(d1) 创建一个具有5GB内存和3个cpus的docker容器(d2) 创建一个具有2GB内存和2个cpus的docker contianer(d3) 我注意到docker run需要使用-m标志,我可以设置内存限制,它还有--cpuset-cpus,我可以使用它来为我的容器分配特定的cpu核心。
我可以使用上面的标志创建d1和d2。虽然创建i观察到我必须采用核心管理核心,即我必须维护带容器的核心分配。
我可以自动提供核心数量和核心分配吗?
创建d1和d2之后,因为我已经用完了所有可用内存和cpuset,所以不应该允许我创建更多容器。
但如果我尝试创建一个内存为3GB的容器d4,我就能成功创建它。
如何在不与其他容器共享内存的情况下将内存分配给该特定容器?
是否有任何已构建的解决方案负责管理分配有容器的内存和分配有容器的cpu-cores?或者我是否必须自己维护这些信息并确保在所有内存或内核都用完后我不应该创建新的容器?
答案 0 :(得分:0)
自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个副本。如果您的群集没有足够的资源,容器将被保留为待处理。