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在一个时刻,只能给一个进程占用

  1. 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 .
  1. 使用如下命令创建容器,命令中的–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 参数一般联合使用。

  1. –cpu-period 是用来指定容器对CPU的使用要在多长时间内做一次重新分配
  2. –cpu-quota:容器获得资源的分配比例;用来指定在这个周期内,最多可以有多少时间用来跑这个容器;与–cpu-shares 不同的是,这种配置是指定一个绝对值,容器对CPU资源的使用绝对不会超过配置的值。
  3. 参数的单位:
    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种:

  1. 查询容器的资源限制参数
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
  1. docker inspect centos_quota1 ##查询资源限制

4、cpu core控制资源

对多核CPU的服务器,Docker 还可以控制容器运行使用哪些CPU内核,即使用–epuset-cpus参数。这对具有多CPU的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
两种控制资源的使用方式:

  1. 创建容器时直接使用参数指定资源限制
    [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
  2. 创建容器后,指定资源分配
    修改宿主机对应容器资源控制的文件,位置:/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

  1. 限制容器写/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
  1. 限制容器写/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
  1. 对磁盘不做限制明显速度快很多
[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资源限制的主要内容,如果未能解决你的问题,请参考以下文章

docker私有仓库registry和cgroup资源限制

docker私有仓库registry和cgroup资源限制

docker私有仓库registry和cgroup资源限制

docker私有仓库部署cgroup资源限制

docker私有仓库部署,和cgroup资源限制

docker私有仓库部署cgroup资源限制