每个Docker容器在运行时都需要CPU, 内存以及IO资源,而运行Docker容器的主机的资源是有限的,因此如何有效的管理和使用资源就非常的重要了,因此Docker也提供了一下机制可以限制容器使用的资源。
在使用 docker run 启动容器时,提供了参数-c int或者–cpu-shares int可以帮助我们限制容器对CPU的使用。参数值是一个整数类型,用于设置当前Docker容器使用cpu的权重值(默认为1024)。这是一个相对值,每个容器能够使用的cpu, 取决于它的cpu shares 占所有容器cpu share的比例: 例如:
docker run --name "container1" -c 1024 image
docker run --name "container2" -c 512 image
在上述情况下,如果二者都需要内存,那么 container1 分配到两倍于 container2 的CPU资源。
另外需要注意,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。当CPU还有足够的空闲资源时,是没有此限制的。
我们知道内存包括 实际的物理内存 和 交换内存(swap), 因此 Docker也分别提供了参数来控制内存的使用。
在使用 docker run 启动容器时,提供参数-m bytes或者–memory bytes可以帮助我们限制容器对内存的使用。
这里的 bytes 指的是以字节为单位的最大使用限额,指的是明确的限额,而不是一个相对值。
例如:
docker run -m 200M image
此时该容器在运行时可以使用的最大的内存值为 200M, 此时 swap 最大值是物理内存的两倍。
在使用 docker run 启动容器时,提供参数–memory-swap bytes可以帮助我们限制容器对swap的使用。
与 -m 参数的使用方式相同,并且二者可以同时使用:
docker run -m 200M --memory-swap=300M image
创建的新镜像可以使用最多 200M 物理内存和 300M swap。
IO资源同样也是操作系统的一种非常重要的资源,通常包含了对硬盘的读写,网络数据的交换等等,这里指关注对 Docker host的硬盘的读写(即block IO)。
控制容器读写硬盘的方法有以下几种:
在使用 docker run 启动容器时,提供参数–blkio-weight int可以帮助我们控制容器读写磁盘(block IO)的优先级。
这个参数类似于使用 -c 对 cpu资源 的控制方式, 设置的是相对值,而不是绝对值。其含义和分配方式均与 -c 类似,这里就不细说了。
在使用 docker run 启动容器时, 提供了以下参数来加以控制:
这里的设置指的就是硬盘,磁盘等等,通过这些参数,可以严格的限制当前容器对某个存储设备的读写速度。
–device-read-iops和–device-write-iops参数值的格式为:
例如:
docker run -it --device-write-bps /dev/sda:30MB --device-write-iops /dev/sdb:10000 image
上述命令,限制了新容器对磁盘设备/dev/sda的每秒钟后读写的字节数(bps)为30MB, 以及对 /dev/sdb设备的读写最大次数为10000次.