默认情况下容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。

但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制

为什么限制

为什么要限制容器对内存的使用?

限制容器不能过多的使用主机的内存是非常重要的。对于 linux 主机来说,一旦内核检测到没有足够的内存可以分配,就会扔出 OOME(Out Of Memmory Exception),并开始杀死一些进程用于释放内存空间。糟糕的是任何进程都可能成为内核猎杀的对象,包括 docker daemon 和其它一些重要的程序。

针对这个问题,docker 尝试通过调整 docker daemon 的 OOM 优先级来进行缓解。内核在选择要杀死的进程时会对所有的进程打分,直接杀死得分最高的进程,接着是下一个。当 docker daemon 的 OOM 优先级被降低后(注意容器进程的 OOM 优先级并没有被调整),docker daemon 进程的得分不仅会低于容器进程的得分,还会低于其它一些进程的得分。这样 docker daemon 进程就安全多了。

下面的脚本直观的看一下当前系统中所有进程的得分情况

1
2
3
4
5
6
7
#!/bin/bash
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
printf "%2d %5d %s\n" \
"$(cat $proc/oom_score)" \
"$(basename $proc)" \
"$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)"
done 2>/dev/null | sort -nr | head -n 40

内存限制

-m(--memory=) 选项可以完成这样的配置

1
docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash

-m 选项限制容器使用的内存上限为 300M。同时设置 memory-swap 值为 -1,它表示容器程序使用内存的受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。

docker stats 命令查看实际情况

CPU限制

可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间

1
docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash

将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。

还有很多其他设置,可以参考Docker(二十)-Docker容器CPU、memory资源限制

参考文章

https://www.cnblogs.com/sparkdev/p/8032330.html

Docker(二十)-Docker容器CPU、memory资源限制