限制容器占用的系统资源
docker run --help
内存限制

上图是内存参数
试一下
新建一个dockerfile构建镜像
FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD ["--version"]
docker build -t sixmillions/stress .

docker run --memory=200M sixmillions/stress --vm 1 --verbose --timeout 5s
加上—timeout是让它停下来,不然会一直debug,除非stop掉容器.
只指定—memory的话,—memory-swap也会分配相同大小 .
我给memory分配了200M,没有分配memory-swap,默认memory-swap也会分200M,也就是说.最后是400M
docker run --memory=200M sixmillions/stress --vm 1 --verbose --vm-bytes 500M --timeout 5s

因为我们一共才给容器分了400M,用stress测试的时候要用500M,超过了容器资源限制,所以出错了
侧面反映了容器资源限制参数生效了.
cpu限制

采用的是相对权重.
举例,第一个容器设置为5,第二个容器设置为10,并且机器上就只运行了这两个容器
那他们就以1:2的比例瓜分了cpu资源.
实验一下
我们打开三个窗口
第一个窗口监测主机cpu资源
第二个窗口准备运行第一个容器testcpu5
分配cpu权重为5
docker run -it --name testcpu5 --cpu-shares=5 sixmillions/stress --cpu 1

第三个窗口准备运行第二个容器testcpu10
分配cpu权重为10
预测结果:
容器testcpu10分配的cpu资源是容器testcpu5的两倍
我们先运行第一个容器testcpu5
查看第一个窗口cpu的使用情况
可以看到这个4330的进程占据了100%cpu
接着我们运行第二容器testcpu10
观察第一个窗口
发现并没有按照比例分配,
猜想原因可能是在不同的cpu核上执行的
lscpu

发现我们是4核
验证我们的猜想
在第一窗口按F或者 shift + f
键盘上下键移动到 P = Last Used Cpu (SMP)
然后按空格,就会出现*
然后按 Q 退出

果然使用了不同核心.
我们先停掉并删除这两个容器
docker stop xxx xxx
docker rm xxx xxx
方法一:让他们运行在同一个cpu核心上
使用参数 --cpuset-cpus=0 指定为在0核心上运行
docker run -it --name testcpu5 --cpu-shares=5 --cpuset-cpus=0 sixmillions/stress --cpu 1

查看
运行第二个容器
docker run -it --name testcpu10 --cpu-shares=10 --cpuset-cpus=0 sixmillions/stress --cpu 1
方法二:测试4个核心
还是先停掉上面运行的容器
然后使用stress的 --cpu 4 跑满四个核心
docker run -it --name testcpu5 --cpu-shares=5 sixmillions/stress --cpu 4

查看
可以看到四个核心都跑着
下面运行第二个容器
docker run -it --name testcpu10 --cpu-shares=10 --cpuset-cpus=0 sixmillions/stress --cpu 4

查看
结果并不是那么明显的比例,和我们想的有一些出入,但是不管怎么说,也是进行了cpu资源的分配,
内部使用更复杂的分配方式.
总结:
无论宿主机有多少个cpu或者内核,—cpu-shares选项都会按照比例分配cpu资源。
另外只有一个容器时—cpu-shares选项无意义。
原理

容器资源限制原理,是linux的Namespaces和文件系统.



