Docker资源配额指的是对Docker容器或服务在系统资源使用方面的限制。 通过资源配额,可以控制和限制Docker容器可以使用的CPU、内存、磁盘空间和网络带宽等资源。
根据应用程序的需求和系统环境来设置适当的资源配额:过于严格的配额可能导致应用程序性能下降,而过于宽松的配额可能会导致资源浪费和冲突,资源配额提供了更好的资源控制和管理机制,以确保容器化环境的稳定性和性能。
CPU资源配额
#查看帮助
docker run --help | grep cpu
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds
--cpu-rt-runtime int Limit CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
#CPU份额-c, --cpu-shares
CPU shares在创建容器时指定容器所使用的CPU份额值
是一个相对的加权值,不能保证获取绝对的core数量,默认docker容器cpu份额为1024
份额为1000的A容器和2000的B容器,B获取CPU占用时间的是A的两倍
如果CPU是充足,那么A和B都能获得充足的CPU
docker run -itd --name cpu1 --cpu-shares 1000 centos /bin/bash
docker exec -it cpu1 /bin/bash
cat /sys/fs/cgroup/cpu/cpu.shares
#1000
#CPU核数--cpuset-cpus、--cpuset-mems
可以控制容器运行限定使用哪些cpu内核和内存节点
更适用于具有NUMA拓扑(具有多CPU、多内存节点)的服务器
#nproc查看有多少个可用cpu
8
#使其绑定两个CPU
docker run -itd --name cpu1 --cpuset-cpus 0,1 centos /bin/bash
#puset-cpus和cpu-shares混合使用
docker run -itd --name cpu1 --cpuset-cpus 0,1 --cpu-shares 1000 centos /bin/bash
docker exec -it cpu1 /bin/bash
rm -rf /etc/yum.repos.d/* && exit
docker cp Centos-vault-8.5.2111.repo cpu1:/etc/yum.repos.d/
docker run -itd --name cpu2 --cpuset-cpus 0,1 --cpu-shares 2000 centos /bin/bash
docker exec -it cpu2 /bin/bash
rm -rf /etc/yum.repos.d/* && exit
docker cp Centos-vault-8.5.2111.repo cpu2:/etc/yum.repos.d/
#在容器内下载与使用stress压测软件,然后我忘了要在里面放centos8的源文件了
docker exec -it cpu1 yum install -y epel-release
docker exec -it cpu1 yum install -y stress
docker exec -it cpu2 yum install -y epel-release
docker exec -it cpu2 yum install -y stress
stress --help #查看stress帮助,直接看example就行
#Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
#开始测试,开三个terminal,一个cpu1,一个cpu2,一个看top
docker exec -it cpu1 /bin/bash
stress -c 2 --timeout 5m
docker exec -it cpu2 /bin/bash
stress -c 2 --timeout 5m
#再开一个terminal看top
内存资源配额
根据容器所运行的业务,配置相应最大内存,防止用太多影响其他的业务
docker run --help | grep -i memory
--kernel-memory bytes Kernel memory limit
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
docker run -itd --name mem1 -m 1g centos
docker exec -it mem1 cat /sys/fs/cgroup/memory/memory.limit_in_bytes
1073741824
IO资源配额
控制IO资源
docker run --help | grep write
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
--device-write-iops list Limit write rate (IO per second) to a device (default [])
docker run --help | grep read
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
--device-read-iops list Limit read rate (IO per second) from a device (default [])
#创建容器io,设置存储映射关系,设备sda限制io速度1mb每秒
docker run -it -v /test/:/test/ --device /dev/sda:/dev/sda \\
--device-write-bps /dev/sda:1mb --name io centos /bin/bash
#使用dd命令,从sda写到/test/内,块大小1M,传送60个块,绕过内核缓存,直接读取和写入设备
time dd if=/dev/sda of=/test/transblock bs=1M count=60 oflag=direct,nonblock
#读数据同理
结束运行资源释放
设置容器结束运行后自动释放资源,适用于一次性的容器如测试容器
如果容器是异常退出了也会被删除
docker run --help | grep rm
--rm Automatically remove the container when it exits
#只设置一个5秒钟的任务
docker run -it --rm --name rmtest alpine sleep 5
docker ps -a | grep rm
#无,已经被自动删除了