docker的资源控制

对容器使用宿主机的资源进行限制。例如:cpu、内容、磁盘I/O

docker使用Linux自带的功能Cgroup功能进行控制

Cgroup是什么?

Cgroup:Control grouos是Linux内核系统提供的一种可以限制、记录、隔离进程组所使用的物理资源机制。

docker借助这个机制,来实现资源的控制

Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构。分配控制的机制来实现资源控制。

host:容器和宿主公用一个网络命名空间

container容器和容器之间公用一个网络命名空间

其他资源依然是隔离的

1、 cpu资源控制

Linux通过CFS(Completely Fair Scheduler):完全公平调度器,来调度各个进程对cpu使用。

CFS的调度周期:100ms

我们也可以自定义容器的调度周期以及在这个周期时间内,各个容器能够使用cpu的调用时间

只能在容器创建时候进行限制

--cpu-period
#设置容器调度cpu的周期
--cpu-quota
#设置每个周期内容器可以使用cpu的时间
这两者可以配合使用

CFS周期的有效范围:1ms-1s --cpu-period 1000-1000000

容器使用cpu的配额时间,必须大于1ms,--cpu-quota的值必须是>=1000(1ms)

docker run -itd --name test1 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/d62c444a5e4118a078e84be01de30f18372b28dfe7358caee183f4da986fa40a
cat cpu.cfs_quota_us
-1
#如果配置是-1,那么容器在使用宿主机cpu的时间不做任何限制
cat cat cpu.cfs_period_us
100000
#CFS调度周期的产长度
#单位是微秒
#在每个容器内,容器可以使用指定比例的cpu时间。默认情况下都是100毫秒

docker的资源控制_第1张图片

docker的资源控制_第2张图片

CFS调度器,100毫秒就是定义了一个周期,在这个周期内,调度任务(容器)的基本时间单位

100毫秒一次调度容器请求cpu的资源。然后把内核cpu资源分配给容器

cat cpu.cfs_quota_us:调度请求之后,根据配额,内核分配给容器使用cpu的时间

容器占用cpu的时间

修改配置文件进行cpu限制

docker exec -it test1 bash
yum -y install vim 
vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod 777 cpu.sh
./cpu.sh

docker stats test1/id
#可以查看容器的运行占用宿主机资源的情况
docker top test1
#查看容器内的进程pid和容器外的进程pid映射关系

修改配置文件进行cpu限制:
docker ps -a
cd /sys/fs/cgroup/cpu/docker/d62c444a5e4118a078e84be01de30f18372b28dfe7358caee183f4da986fa40a
echo 50000 > cpu.cfs_quota_us
在容器中查看是否生效
cd /opt/
top

docker的资源控制_第3张图片

创建容器时进行cpu限制

创建容器时进行cpu限制:
docker run -itd --name test2 --cpu-quota 40000 centos:7 /bin/bash
docker exec -it test2 bash
vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod 777 cpu.sh
./cpu.sh

设置容器占用cpu的权重比

需要多个容器才能生效

--cpu-shares
#指定容器占用cpu的份额
#默认权重是1024,设置的值只能是1024的倍数
docker run -itd --name test3 --cpu-shares 512 centos:7 /bin/bash
docker run -itd --name test4 --cpu-shares 1024 centos:7 /bin/bash
docker exec -it test3 bash
yum -y install epel-release
yum -y install stress
#下载模拟系统负载的工具
stress -c 4
在宿主机查看
top

docker exec -it test4 bash
yum -y install epel-release
yum -y install stress
stress -c 4
在宿主机查看
docker stats
#不加容器名就是显示所有容器占用情况

--cpu-shares:给每个容器使用cpu设置了相对的权重,权重高的使用cpu的资源更多。但是如果只有一个容器在运行,即便设置了权重。但是没有其他更高的权重来占用资源,权重低的容器依然不受限制。

绑定容器使用指定的cpu

容器只能使用指定的cpu内核

docker run -itd --name test5 --cpuset-cpus 1 centos:7 /bin/bash
docker exec -it test5 bash
yum -y install epel-release
yum -y install stress
stress -c 4
在宿主机查看
top

cpu总结

容器占用cpu的时间

容器占用cpu的权重比(多个容器时,才有效)

容器占用cpu的内核数,绑定指定的cpu内核给容器使用

2、 内存控制

docker run -itd --name test6 -m 512m centos:7 /bin/bash
docker stats

3、 如何限制使用swap(了解即可)

如果需要限制容器使用swap必须和限制内存一起使用

docker run -itd --name test7 -m 512m --memory-swap=1g centos:7 /bin/bash
docker stats

1、 如果限制了内存是512m,swap是1g那么容器实际上能够使用的swap空间是1g-512m

2、 如果没有限制swap创建容器。使用swap的空间是-m后面值的2倍

3、 如果设置--memory-swap的值,和内存限制一样,容器就不能使用swap

4、 如果设置-m 512m --memory-swap=-1:表示内存受限,但是容器使用swap空间不再限制

4、 磁盘I/O的限制(了解即可)

限制容器在磁盘上的读速度

doker run -itd --name test8 --device-read-bps /dev/sda:1M centos:7 /bin/bash

限制容器在磁盘上的写限制

doker run -itd --name test9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
docker exec -it test9 bash
dd if=/cev/zero of=123.txt bs=1 count=10 oflag=direct

oflag=direct:在使用dd获取空字符集是从文件系统的缓存中输入,速度是比较快的,禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能。模拟直接写入物理设备的情况

docker的资源控制_第4张图片

限制容器读取的次数

docker run -itd --name test10 --device-read-iops /dev/sda:100 centos:7 /bin/bash
#限制读取操作每秒100次
#100:表示每秒读100次

限制容器写入的次数

docker run -itd --name test10 --device-write-iops /dev/sda:50 centos:7 /bin/bash
#限制写入的操作每秒50次
#50:表示每秒写50次

如何清理docker占用的磁盘空间

docker system prune -a
#清理docker占用磁盘的空间

docker system prune -a:会删除已经停止的容器,删除所有未被使用的网桥设备、删除所有未被使用的镜像,删除创建容器时的缓存以及无用的数据卷

实验:

创建三个容器分别对这三个容器进行资源限制。

实验准备:

centos:7 x 3

centos1:占用cpu时间 10000,占用cpu权重256,占用内存1g,绑定cpu:1

centos2:占用cpu时间 20000,占用cpu权重512,占用内存2g,绑定cpu:2

centos3:占用cpu时间 30000,占用cpu权重1024,占用内存512m,绑定cpu:3

使用一条命令完成

Docker pull centos:7
开始创建容器
Centos1:
docker run -itd --name centos1 --cpu-quota 10000 --cpu-shares 256 -m 1g --cpuset-cpus 1 centos:7 /bin/bash
Centos2:
docker run -itd --name centos2 --cpu-quota 20000 --cpu-shares 512 -m 2g --cpuset-cpus 2 centos:7 /bin/bash
Centos3:
docker run -itd --name centos3 --cpu-quota 30000 --cpu-shares 1024 -m 512m --cpuset-cpus 3 centos:7 /bin/bash

docker的资源控制_第5张图片

创建完成后进入容器

进行cpu时间限制测试

yum -y install vim
vim cpu.sh

#!/bin/bash
i=0
while true
do
let i++
done
chmod 777 cpu.sh
./cpu.sh

 docker的资源控制_第6张图片

到外部查看

docker的资源控制_第7张图片

实验完成

总结

怎么对容器使用cpu限制?

1、 容器占用cpu的时间

2、 容器占用cpu的权重

3、 容器绑定cpu

容器对宿主机的内存使用限制:

-m

swap(了解即可):必须和限制内存一起使用

磁盘I/O(了解即可)

清理docker占用的磁盘空间:会删除已经停止的容器,删除所有未被使用的网桥设备、删除所有未被使用的镜像,删除创建容器时的缓存以及无用的数据卷

你可能感兴趣的:(Docker从入门到精通,docker,容器,运维)