docker容器技术底层是通过Cgroup实现容器对物理资源使用的限制,限制资源包括CPU,内存,磁盘三个 方面,基本覆盖了常见的资源配额和使用控制。
我们需要用docker来创建一个基于centos的stress工具镜像,这个工具包可以实现centos的一些测试,并且在容器中需要有一个centos的镜像
docker制作镜像
1.制作镜像
- 创建一个目录,为镜像做基础环境,制作镜像
-
[root@localhost ~]# mkdir stress/ [root@localhost ~]# cd stress/ [root@localhost stress]# cat Dockerfile FROM centos MAINTAINER Carrie "964329491@qq.com" RUN yum -y install wget RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
FROM centos ------>从哪里获取 MAINTAINER Carrie "964329491@qq.com" ----->作者信息
RUN起来的都是镜像中带的命令 RUN yum -y install wget RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo -
创建镜像 并指定名字 (./ 意思为当前环境进行构建)
-
[root@localhost stress]# docker build -t centos:stress ./
- 创建成功之后查看一下
-
[root@localhost stress]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos stress 2ce5a732f6f3 5 minutes ago 311MB
CPU资源限制
1.CPU资源(使用率)限制
在centos7中可以通过修改对应的cpu.crs_quota_us参数进行实现
基于刚才创建好的镜像运行一个容器,将其的CPU使用设置成20000,设置CPU的使用率为20%。
-
root@localhost ~]# echo "20000" > /sys/fs/cgroup/cpu,cpuacct/docker/73a49b54a9e0f25270a607af78c14ca275a16cde97ef974e43208c1d6d75c9e1/cpu.cfs_quota_us
- 进行CPU限制的压力测试
-
[root@localhost ~]# docker attach 73a [root@73a49b54a9e0 /]# stress -c 10 ------->开启10个进程 stress: info: [14] dispatching hogs: 10 cpu, 0 io, 0 vm, 0 hdd
-
开启10个
-
开启20 个
-
CPU的平均使用会降低
2. cpu资源(cpu共享比例)
当运行多个容器,很难技术算CPU的使用率,为了使容器合理的使用CPU的资源。可以通过--cpu-shares选项设置容器按比例共享CPU资源
- 资源分配 stress-1:stress-2:stress-3=1:1:2
[root@localhost ~]# docker run --name stress-1 -itd --cpu-shares 1024 centos:stress /bin/bash f0d5608696c01b0e0df34a30b8c8d664d1679e3f167b74bf23e763bf8229df5b [root@localhost ~]# docker run --name stress-2 -itd --cpu-shares 1024 centos:stress /bin/bash b336740b3fbf4c224fe40b200e17960fa770f1cd3a94f5b683864dd5b4f990cb [root@localhost ~]# docker run --name stress-3 -itd --cpu-shares 2048 centos:stress /bin/bash 8eba7ba535df1a1f853cd03529daa3cb37e6c81675b63bc1a2bb43eb253f3a35 [root@localhost ~]#
- 删除
-
[root@localhost ~]# docker rm -f $(docker ps -a | awk '/centos:stress/ {print $1}') 8eba7ba535df b336740b3fbf f0d5608696c0 916c47bd4133 73a49b54a9e0
3.CPU周期性限制
- docker 提供了--cpu-period,--cpu-quota 两个参数控制容器可以分配CPU时钟周期。
- --cpu-period 是用来指定容器对cpu的使用要在多长时间进行重新分配。
- --cpu-quota 是用来指定在这个周期内,最多可以多长时间来跑这个容器。
- 优点是指定的值,没有弹性
4.CPU核心限制
多核cpu的服务器,docker还能控制容器运行限制使用那些CPU内核,可以使用--cpuset-cpus选项来使得某些程序独享CPU核心。如果是16核,那CPU标号是0-15.
内存限制
容器可使用的内存有两种,物理内存核和交换分区,docker通过下面的两组参数来控制容器内存的使用量。
- -m :设置内存使用限额。例如100M
- --memory-swap:设置内存swap的使用限额(--vm 1启动一个工作线程,--vm-bytes 280M大小为280M)
-
[root@localhost ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
Block IO 限制
默认情况下,所有的容器能平等的读写磁盘,可以通过--blkio-weight参数来改变block IO的优先级
- --blkio-weight 设置权重值,默认为500
-
[root@localhost ~]# docker run -it --name=container_A --blkio-weight 300 centos:stress [root@localhost ~]# docker run -it --name=container_B --blkio-weight 600 centos:stress
bps和iops限制
如果在一台服务器上进行容器的混合部署,那么会存在同时几个程序写磁盘数据的情况,这时可以通过--device-write-iops选项来限制每秒的IO次数来限制制定设备的写速度,相应的还有--device-read-iops选项限制读取IO的速度.
- --device-write-bps
- --device-read-bps
- --device-write-iops
- --device-read-iops