我使用的是Docker 17.03 -ee版本
我必须动态地创建一个具有可变内存量和可变cpus数量的docker容器,并且这个硬件不应该在容器之间共享。
举个例子,让我们考虑一下我有
具有8 8GB内存和4核的主机。
创建一个具有3 3GB内存和1个cpus的坞站容器(d1)
创建一个具有5 5GB内存和3个cpus的坞站容器(d2)
创建具有2 2GB内存和2个cpus的坞站连接器(d3)
我注意到docker run使用-m标志,我可以使用它来设置内存限制,它还有--cpuset- cpu,我可以使用它将特定的cpu核心分配给我的容器。
我能够使用上面的标志创建d1和d2。在创建时,我观察到我必须获得核心管理的核心,即我必须维护具有容器的核心的分配。
我可以只给出内核的数量,内核分配会自动处理吗?
在创建d1和d2之后,因为我已经用完了所有可用的内存和cpuset,所以不应该允许我创建更多的容器。
但是如果我尝试创建一个内存为3 3GB的容器d4,我就能够成功地创建它。
如何在不与其他容器共享内存的情况下将内存分配给该特定容器?
有没有已经构建的解决方案来管理分配给容器的内存和分配给容器的cpu核心?或者我必须自己维护这些信息,并确保在所有内存或内核用完后不会创建新的容器?
发布于 2017-07-10 20:03:47
从docker 1.13开始,你就可以使用--cpus了,这可能就是你想要的。在1.13之前,你必须使用--cpu-period和--cpu-quota,而--cpus实际上是它的助手。
限制容器只使用1核:--cpus=1.0,2核--cpus=2.0等。也可以使用分数。但请注意,无论是--cpus还是--cpuset-cpus都不保留这些cpus。它只是限制了可以使用多少cpu (或哪些核心),但不能禁止任何其他容器/进程使用相同的资源。
情况与内存(--memory)类似。您可以声明最大限制,并且容器分配的资源不能超过您的限制。但它不会以任何方式保留或“预分配”内存。
如果你正在寻找一种强制这种行为的方法,你应该看看容器编排解决方案,比如kubernetes,openshift,docker swarm等等。这些解决方案是专门为一种在集群中轻松分发容器的方式而创建的,同时考虑到总的集群资源。然后,您可以简单地指定,例如:容器X应该使用最多2个核心,最大500MB内存,并具有2个副本。如果您的集群没有足够的资源,容器将被简单地留为挂起状态。
https://stackoverflow.com/questions/45008740
复制相似问题