Docker--私有仓库建立Cgroup资源限制
Posted 可乐卷儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker--私有仓库建立Cgroup资源限制相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、私有仓库建立
docker pull registry
vim /etc/docker/daemon.json
"insecure-registries":["192.168.35.70:5000"], ##添加,本地地址端口:5000
"registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
systemctl restart docker
docker create -it registry /bin/bash
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a63be9150b3c registry "/entrypoint.sh /bin…" 8 seconds ago Created jovial_mcclintock
docker start a63be9150b3c
docker ps -a ##查询状态 异常退出
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
docker ps -a
docker tag nginx:latest 192.168.35.70:5000/nginx ##打上标签
docker push 192.168.35.70:5000/nginx
curl -XGET http://192.168.35.70:5000/v2/_catalog ##显示上传成功
"repositories":["nginx"]
docker rmi 192.168.35.70:5000/nginx
docker pull 192.168.35.70:5000/nginx ##下载
二、Cgroup资源
- Docker通过Cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
- Cgroup是ControlGroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如CPU、内存、磁盘I0等等)的机制
1、CPU使用率控制
cpu周期: 1s为一个周期的定律,参数值一般为100000 (CPU衡量单位是秒)
假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s
cpu在一个时刻,只能给一个进程占用
- stress压力测试工具测试cpu和内存使用情况
--------->使用 Dockerfile 来创建一个基于Centos 的stress工具镜像<--------------------------------------
[root@docker-lnmp ~]# cd /opt
[root@docker-lnmp opt]# mkdir /opt/stress
[root@docker-lnmp opt]# cd stress
[root@docker-lnmp stress]# vim Dockerfile
FROM centos:7
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install stress
[root@docker-lnmp stress]# docker build -t centos:stress .
- 使用如下命令创建容器,命令中的–cpu-shares参数值不能保证可以获得1个vcpu或者多少GHz的CPU资源,它仅是一个弹性的加权值
[root@docker-lnmp stress]# docker run -itd --cpu-shares 100 centos:stress
b56ebe723deac667421caec76f2ccd7b23f608a59e0a30858c2603f37967c94f
默认情况下,每个Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来
2、Cgroups-优先级/权重限制
只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。
可以通过cpu share 设置容器使用CPU 的优先级/权限,比如启动了两个容器及运行查看CPU使用百分比。
docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10 ##容器内部模拟10个子函数进程
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10 ##再开启一个容器做比较
docker stats 查看资源使用
3、CPU周期限制
Docker提供了**–cpu-period、–cpu-quota** 两个参数控制容器可以分配到的CPU时钟周期。cpu-period 和cpu-quota 参数一般联合使用。
- –cpu-period 是用来指定容器对CPU的使用要在多长时间内做一次重新分配
- –cpu-quota:容器获得资源的分配比例;用来指定在这个周期内,最多可以有多少时间用来跑这个容器;与–cpu-shares 不同的是,这种配置是指定一个绝对值,容器对CPU资源的使用绝对不会超过配置的值。
- 参数的单位:
cpu-period和cpu-quota 的单位为微秒(μs)。
cpu-period 的最小值为1000微秒,最大值为 1秒(10^6μs),默认值为0.1秒(100000 μs)
cpu-quota的值默认为-1,表示不做控制(不做任何限制)
例如
容器进程需要每1秒使用单个CPU的0.2秒时间,可以将cpu-period 设置为1000000 (即1秒),cpu-quota 设置为200000 (0.2秒)。
当然,在多核情况下,如果允许容器进程完全占用两个cPU, 则可以将cpu-period 设置为100000 (即6.1d秒),cpu-quota设置为200000 (0.2 秒)。
查询资源限制的方式有2种:
- 查询容器的资源限制参数
cd /sys/fs/cgroup/cpu/docker/
cat cpu.cfs_quota_us
cat cpu.cfs_period_us
举例:
[root@docker ~]# docker run -itd --name centos_quota1 --cpu-period 100000 --cpu-quota 200000 centos:stress
696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc88350f
[root@docker docker]# cd 696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc88350f
[root@docker 696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc883
100000
[root@docker 696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc88350f]#
200000
- docker inspect centos_quota1 ##查询资源限制
4、cpu core控制资源
对多核CPU的服务器,Docker 还可以控制容器运行使用哪些CPU内核,即使用–epuset-cpus参数。这对具有多CPU的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
两种控制资源的使用方式:
- 创建容器时直接使用参数指定资源限制
[root@docker ~]# docker run -itd --name cpu --cpuset-cpus 0-1 centos:stress
5f5b2d07e6bbb8655db6cef030c816282b5c0e8df2c0cd466d3d86c644f9303a
执行以上命令需要宿主机为双核,表示创建的容器只能用0/1两个内核,最终胜出的cgroup的cpu内核配置如下:
[root@docker ~]# cd /sys/fs/cgroup/cpuset/docker/
[root@docker docker]# cd 5f5b2d07e6bbb8655db6cef030c816282b5c0e8df2c0cd466d3d86c644f9303a
[root@docker 5f5b2d07e6bbb8655db6cef030c816282b5c0e8df2c0cd466d3d86c644f9303a]# cat cpuset.cpus
0-1 - 创建容器后,指定资源分配
修改宿主机对应容器资源控制的文件,位置:/sys/fs/cgroup/**目录下修改对应的文件参数
5、cpu配额控制参数的混合使用
通过cpuset-cpus 参数指定容器A使用CPU内核0,容器B只使用CPU内核1。
[root@docker stress]# docker run -tid --name cpu2 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
680a5d0d39bd69a5340d046313f896a6f514ad2d1ff78ce6d17dbc35315716ec
[root@localhost stress]# top ##记住按1查看每个核心的占用;结果显示占用cpu1的资源
top - 18:28:44 up 1:11, 2 users, load average: 0.70, 0.24, 0.22
Tasks: 233 total, 2 running, 231 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990280 total, 4738804 free, 821800 used, 2429676 buff/cache
KiB Swap: 307196 total, 307196 free, 0 used. 6789000 avail Mem
[root@docker stress]# docker run -tid --name cpu3 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
4c0956d2f2301b1e08865ffd2b13708482b638a7478a2a7fa4d14b933cfefeb6
[root@localhost stress]# top ##记住按1查看每个核心的占用;结果显示占用cpu3的资源
top - 18:29:31 up 1:11, 2 users, load average: 0.86, 0.35, 0.25
Tasks: 236 total, 3 running, 233 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990280 total, 4729164 free, 830364 used, 2430752 buff/cache
KiB Swap: 307196 total, 307196 free, 0 used. 6779532 avail Mem
-----------------》以上是不同的cpu
以下仍使用cpu3,查看资源使用情况
[root@docker stress]# docker run -tid --name cpu0 --cpuset-cpus 3 --cpu-shares 512 centos:stress stress -c 1 ##仍使用cpu3,
docker stats ##查看资源使用
6、内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和Swap。
Docker通过下面两组参数来控制容器内存的使用量。
-m或–memory: 设置内存的使用限额,例如100M、 1024M
–memory-swap:设置内存+swap的使用限额
执行如下命令允许该容器最多使用200M的内存和300M 的swap。
docker run -it -m 200M --memory-swap=300M centos:stress
--vm 1 --vm-bytes 280M
--vm1:启动1个内存工作线程
--vm-bytes 280M: 每个线程分配280M内存
docker status ##另开终端查询
docker run -it centos:stress
docker status
默认情况下,容器可以使用主机上的所有空闲内存。
与CPU的cgroups 配置类似,Docker会自动为容器在目录/sys/ fs/ cgroup/ memory/docker/<容器的完整长WID>中创建相应cgroup 配
7、Block IO的限制
默认情况下,所有容器能平等地读写磁盘,可以通过设置**–blkio-weight**参数来改变容器blockI0的优先级。
–blkio-weight 与–cpu-shares 类似,设置的是相对权重值,默认为500。
在下面的例子中,容器A读写磁盘的IO是容器B的两倍
docker run -it --name container_01 --blkio-weight 600 centos:stress
docker run -it --name container_02 --blkio-weight 300 centos:stress ##另开终端
cd /sys/fs/cgroup/blkio/docker ##再开一个终端看下
8、bps和iops的限制
控制磁盘的实际IO
bps是bytepersecond,每秒读写的数据量。
iops是io per second, 每秒 IO 的次数。
可通过以下参数控制容器的bps和iops:
–device-read-bps,限制读某个设备的bps
–device-read-iops, 限制读某个设备的iops
–device-write-iops, 限制写某个设备的iops
- 限制容器写/dev/sda 的速率为5MB/s
[ root@localhost docker]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@d42b2ccf5237 /]# dd if=/dev/zero of=test bs=1M count=10 oflag=direct ##direct:磁盘
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 2.00132 s, 5.2 MB/s ##使用2s复制10M,速度5.2M/s
- 限制容器写/dev/sda 的速率为10MB/s
[root@d4a13dd24f44 /]# docker run -it --device-write-bps /dev/sda:10MB centos:stress
[root@d42b2ccf5237 /]# dd if=/dev/zero of=test bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 9.95113 s, 10.5 MB/s ##使用9.9s复制100M,速度10.5M/s
- 对磁盘不做限制明显速度快很多
[root@docker ~]# docker run -it centos:stress
[root@07ca4ac0fce2 /]# dd if=/dev/zero of=test bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0960668 s, 1.1 GB/s ##使用0.09s复制100M,速度1.1GB/s
9、构建镜像时指定资源限制
以上都是通过命令行去创建,也可以通过构建镜像时指定
参数 | 详解 |
---|---|
–build-arg=[ ] | 设置镜像创建时的变量 |
–cpu-shares | 设置cpu使用权重 |
—cpu-period | 限制CPU CFS周期 |
–cpu-quota | 限制CPU CFS配额 |
–cpuset-cpus | 指定使用的CPUid |
–cpuset-mems | 指定使用的内存id |
–disable-content-trust | 忽略校验,默认开启 |
-f | 指定要使用的Dockerfile路径; |
– force-rm | 设置镜像过程中删除中间容器 |
–isolation | 使用容器隔离技术 |
–label=[ ] | 设置镜像使用的元数据 |
-m \\设置内存最大值
–memory-swap:设置Swap的最大值为内存+swap,"-1"表示不限swap
–no-cache:创建镜像的过程不使用缓存
–pull:尝试去更新镜像的新版本
–quiet,-q:安静模式,成功后只输出镜像ID
–rm:设置镜像成功后删除中间容器
–shm-size:设置/dev/ shm的大小,默认值是64M
–ulimit:ulimit配置
–squash:将Dockerfile 中所有的操作压缩为一层
–tag, -t:镜像的名字及标签,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个标签
–network:默认default。在构建期间设置RUN指令的网络模式
以上是关于Docker--私有仓库建立Cgroup资源限制的主要内容,如果未能解决你的问题,请参考以下文章