Docker--私有仓库建立、Cgroup资源限制

本文详细介绍了如何使用Docker设置容器的CPU、内存和磁盘资源限制,包括CPU使用率、Cgroups权重、周期限制、内存限额以及BlockIO的bps和iops限制。此外,还阐述了如何建立私有仓库,推送和拉取镜像,并通过Dockerfile创建stress工具镜像进行测试。
摘要由CSDN通过智能技术生成

1.私有仓库建立

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		##下载

2.Cgroup资源

Docker通过Cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
Cgroup是ControlGroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如CPU、内存、磁盘I0等等)的机制

2.1CPU使用率控制

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 .

2.2使用如下命令创建容器,命令中的–cpu-shares参数值不能保证可以获得1个vcpu或者多少GHz的CPU资源,它仅是一个弹性的加权值

[root@docker-lnmp stress]# docker run -itd --cpu-shares 100 centos:stress
b56ebe723deac667421caec76f2ccd7b23f608a59e0a30858c2603f37967c94f

默认情况下,每个Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来

2.2Cgroups-优先级/权重限制

只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的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 查看资源使用

2.3CPU周期限制

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

2.docker inspect centos_quota1 ##查询资源限制

2.4pu 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/**目录下修改对应的文件参数

2.5cpu配额控制参数的混合使用

通过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 配

2.7Block 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	##再开一个终端看下

2.8bps和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

2.限制容器写/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

3.对磁盘不做限制明显速度快很多

[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

2.9构建镜像时指定资源限制

构建镜像时指定资源限制

--build-arg=[] :          设置镜像创建时的变量;
--cpu-shares :            设置cpu使用权重;
--cpu-period :            限制CPU CFS周期;
--cpu-quota :             限制CPU CFS配额;
--cpuset-cpus :           指定使用的CPU id;
--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指令的网络模式

小结:

一、资源限制的主要类型
①CPU 权重shares、quota、cpuset
②磁盘 BPS、TPS限制,指定使用哪个磁盘、磁盘分区
③内存 -m 、-swap 内存、交换分区

二、资源限制的几种方式
①build 构建镜像时,可以指定该镜像的资源限制
②run 将镜像跑为容器的时候,可以指定容器的资源限制
③容器启动之后,可以在宿主机对应容器的目录下。修改资源限制,然后重载

/sys/fs/cgroup/* (cpu、blk、mem)/docker/容器ID/--->修改对应的资源限制文件参数就可以

三、资源限制的状态查询
①docker inspect 镜像ID/容器ID
②直接查看宿主机对应容器ID资源限制的文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值