Docker资源配置
简介
Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
cgroup
cgroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。cgroup 将任意进程进行分组化管理的 Linux 内核功能。cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
资源分配的优点
- 不同的容器承担不同的业务 根据业务的重要性分配不同的资源份额
- 通过更好的分配服务器资源 能高加高效稳定的保证容器运行
控制Docker执行任务CPU
配置容器权重
- 默认cpu份额都是1024 在同一个cpu容器运行多个
- cpu份额分配结果取决于容器运行时候的状态 假如:容器A分配的份额为1024容器B分配的份额为512 此时容器A处于空闲状态 那么容器B也会独占整个cpu资源
- cgroups 只在多个容器同时争抢同一个 cpu 资源时,cpu 配额才会生效
[root@SR ~]# docker run -it --cpu-shares 521 centos:7.6.1810 /bin/bash # 分配512的权重
[root@4a808316880a /]# cat /sys/fs/cgroup/cpu/cpu.shares # 查看权重
配置容器cpu的亲和力
# 配置容器对cpu 0 1亲和力
[root@SR ~]# docker run -it --name cpu_set --cpuset-cpus 0,1 centos:7.6.1810 /bin/bash
[root@10b7a20b1515 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
混合使用
# 使用stress进行压测
# 创建两个实例 权重分别为512和1024
[root@SR ~]# docker run --name docker10 -idt --cpuset-cpus 0,1 --cpu-shares 512 centos:7.6.1810 /bin/bash
[root@SR ~]# docker run --name docker20 -itd --cpuset-cpus 0,1 --cpu-shares 1024 centos:7.6.1810 /bin/bash
[root@557ca1c90049 /]# stress -c 2 -v -t 10m # 容器开启压测
[root@85715d5cac37 /]# stress -c 2 -v -t 10m # 容器开启压测
PS:此处只有cpu 0 1被调度 同时docker20的cpu使用率是docker10的2倍
周期控制
- --cpu-period 是用来指定容器对 CPU 的使用,要在多长时间内做一次重新分配。 指定周期
- --cpu-quota 是用来指定在这个周期内,最多可以有多少时间片断用来跑这个容器。 指定在这个周
期中使用多少时间片 - 跟--cpu-shares 不同的,--cpu-period 和--cpu-quota 是指定一个绝对值,而且没有弹性在里
面,容器对 CPU 资源的使用绝对不会超过配置的值
# 设置 docker 实例每 1 秒只能使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置为1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)
[root@SR ~]# docker run -it --cpu-period 1000000 --cpu-quota 2000000 centos /bin/bash
[root@7150d481dbf1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us # 查看周期
[root@7150d481dbf1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us # 查看周期内时间片
释放容器实例
当容器运行命令结束后 自动删除容器 释放资源
[root@SR ~]# docker run -it --rm --name test_rm centos:7.6.1810 sleep 5 # 使用rm进行删除
[root@SR ~]# docker ps | grep test_rm
控制容器的内存
Docker 提供参数-m, --memory=""限制容器的内存使用量
# 允许容器使用的内存上限为 125M
[root@SR ~]# docker run -it -m 125m centos:7.6.1810
[root@e05e5e6a881c /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 查看内存
控制容器的I/O
防止容器吃光物理机磁盘
[root@SR ~]# docker run -it -v /var/www/html/:/var/www/html --devic/dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos /bin/bash
[root@bd79042dbdc9 /]# time dd if=/dev/sda of=/var/www/html/test.out bs=1M count=50 oflag=direct,nonblock
dd参数解释
direct:读写数据采用直接 IO 方式,不走缓存。直接从内存写硬盘上
nonblock:读写数据采用非阻塞 IO 方式,优先写 dd 命令的数据
Docker数据映射
- Docker存储属于弱项 需要通过外挂进行实现
- 通过映射此时docker损坏 数据存在
物理机与容器数据映射
# 通过-v 进行数据映射
[root@SR ~]# echo "测试Docker的数据映射" /var/www/html/test.html
[root@SR ~]# docker run -it --name test_web -v /var/www/html/:/var/www/html centos /bin/bash # 数据映射
[root@da7eb360b3f4 /]# ls /var/www/html/ # 查看映射目录
[root@da7eb360b3f4 /]# cat /var/www/html/test.html # 查看内容
容器与物理机进行数据映射
[root@da7eb360b3f4 html]# vim test.html
test
[root@SR ~]# cat /var/www/html/test.html