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

目录

一、私有仓库建立

1.下载私有仓库

2.下载镜像

3.配置docker引擎终端

4.挂载容器和守护进程

5.镜像上传镜像仓库

6.私有仓库下载

二、Cgroup 资源

1.CPU使用率控制

2.用stress压力测试工具测试cpu和内存使用情况

3.Cgroups-优先级/权重限制

三、CPU周期限制

1.操作实例

2.查询容器的资源

四、CPU Core 控制

1.创建的容器

2.查看核心占用

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

六、内存限额

七、Block IO的限制

八、bps和iops的限制


一、私有仓库建立

1.下载私有仓库

[root@docker ~]# mkdir docker
[root@docker docker]# cd docker
[root@docker docker]# docker pull registry    #下载私有字符仓库
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete 
0d96da54f60b: Pull complete 
5b27040df4a2: Pull complete 
e2ead8259a04: Pull complete 
3790aef225b9: Pull complete 
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

2.下载镜像

[root@docker docker]# docker pull Nginx     #下载所需的镜像
Using default tag: latest
latest: Pulling from library/Nginx
e5ae68f74026: Pull complete 
21e0df283cd6: Pull complete 
ed835de16acd: Pull complete 
881ff011f1c9: Pull complete 
77700c52c969: Pull complete 
44be98c0fab6: Pull complete 
Digest: sha256:4a49b1fbd5f544755121dee04f7f717416c21ae1bf5ef862aa34fbffbb9e434f
Status: Downloaded newer image for Nginx:latest
docker.io/library/Nginx:latest

[root@docker docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
Nginx        latest    f652ca386ed1   19 hours ago   141MB
registry     latest    b8604a3fe854   2 weeks ago    26.2MB

3.配置docker引擎终端

[root@docker docker]# vim /etc/docker/daemon.json       #新创建一个新的.json文件
{
    "insecure-registries":["192.168.150.10:5000"],
    "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
}

[root@docker docker]# systemctl restart docker.service  #重启服务

4.挂载容器和守护进程

[root@docker docker]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
63c1414bcc8b338210b104bf505f6670a2023e7c0d2d55a945aeae2672883424
[root@docker docker]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                       NAMES
63c1414bcc8b   registry   "/entrypoint.sh /etc…"   54 seconds ago   Up 53 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   competent_kowalevski

5.镜像上传镜像仓库

[root@docker docker]# docker push 192.168.150.10:5000/Nginx
Using default tag: latest
The push refers to repository [192.168.150.10:5000/Nginx]
2bed47a66c07: Pushed 
82caad489ad7: Pushed 
d3e1dca44e82: Pushed 
c9fcd9c6ced8: Pushed 
0664b7821b60: Pushed 
9321ff862abb: Pushed 
latest: digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47 size: 1570

[root@docker docker]# curl -XGET http://192.168.150.10:5000/v2/_catalog   #用字符查看镜像
{"repositories":["Nginx"]}

6.私有仓库下载

[root@docker docker]# docker pull 192.168.150.10:5000/Nginx
Using default tag: latest
latest: Pulling from Nginx
Digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47
Status: Image is up to date for 192.168.150.10:5000/Nginx:latest
192.168.150.10:5000/Nginx:latest

二、Cgroup 资源

Docker通过Cgroup来控制容器使用的资源配额,包括cpu、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

Cgroup是ControlGroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如cpu、内存、磁盘I0等等)的机制

1.cpu使用率控制

cpu周期: 1s为一个周期的定律,参数值一般为100000 (cpu衡量单位是秒)
假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s。cpu一个时刻,只能给一个进程占用

2.用stress压力测试工具测试cpu和内存使用情况

[root@docker docker]# mkdir /opt/stress
[root@docker docker]# cd stress
[root@docker 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 .
[root@docker stress]# docker images
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
centos                      stress    7037090ec672   14 seconds ago   541MB

3.Cgroups-优先级/权重限制

只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。可以通过cpu share 设置容器使用cpu 的优先级/权限,比如启动了两个容器及运行查看cpu使用百分比。

[root@docker stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10   #容器内部模拟10个子函数进程
[root@docker stress]# docker stats    #动态查看容器的资源的使用量
CONTAINER ID   NAME      cpu %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
234fd1982b27   cpu512    802.49%   336KiB / 3.683GiB   0.01%     656B / 0B   0B / 0B     11

[root@docker stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10  #再开启一个容器做比较
[root@docker stress]# docker stats    #动态查看容器的资源的使用量
CONTAINER ID   NAME      cpu %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
a3d1c7297cdd   cpu1024   545.16%   340KiB / 3.683GiB   0.01%     656B / 0B   0B / 0B     11
234fd1982b27   cpu512    252.19%   336KiB / 3.683GiB   0.01%     656B / 0B   0B / 0B     11

三、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.操作实例

例如:容器进程需要每1秒使用单个cpu的0.2秒时间,可以将cpu-period 设置为1000000 (即1秒),cpu-quota 设置为200000 (0.2秒)。
当然,在多核情况下,如果允许容器进程完全占用两个cpu, 则可以将cpu-period 设置为100000 (即0.1d秒),cpu-quota设置为200000 (0.2 秒)。

[root@docker docker]# docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
ad2286f200e2d7a12a6ed4493c85c4f60ef14d0cb8e1187d290f3b98d584f729
[root@docker docker]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
ad2286f200e2   centos:stress   "/bin/bash"   9 seconds ago   Up 8 seconds             upbeat_perlman
[root@docker docker]# docker exec -it ad2286f200e2 bash    #进入容器

2.查询容器的资源

[root@ad2286f200e2 /]# cd /sys/fs/cgroup/cpu
[root@ad2286f200e2 cpu]# ls
cgroup.clone_children  cgroup.procs       cpu.cfs_quota_us  cpu.rt_runtime_us  cpu.stat      cpuacct.usage         notify_on_release
cgroup.event_control   cpu.cfs_period_us  cpu.rt_period_us  cpu.shares         cpuacct.stat  cpuacct.usage_percpu  tasks
[root@ad2286f200e2 cpu]# cat cpu.cfs_period_us 
100000
[root@ad2286f200e2 cpu]# cat cpu.cfs_quota_us  
200000

四、cpu Core 控制

对多核 cpu 的服务器,Docker 还可以控制容器运行使用哪些 cpu 内核,即使用--cpuset-cpus 参数。这对具有多 cpu 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。

1.创建的容器

只能用 0、1两个内核。最终生成 的 cgroup 的 cpu 内核

[root@docker stress]# docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress
c4c808b2ee9b8bfc9ebdeb2bee77f569ac40fb0243cf01b7919fd045fb37f7ec

[root@docker stress]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED              STATUS              PORTS     NAMES
c4c808b2ee9b   centos:stress   "/bin/bash"   About a minute ago   Up About a minute             cpu1

2.查看核心占用

使用下面的命令把容器中进程与 cpu 内核的绑定关系,达到绑定 cpu 内核的目的。

[root@docker stress]# docker exec -it cpu1 /bin/bash -c "stress -c 10 "   
stress: info: [26] dispatching hogs: 10 cpu, 0 io, 0 vm, 0 hdd

[root@localhost stress]# top     #记住按1查看每个核心的占用(只有cpu0和cpu1在工作)
Tasks: 227 total,  11 running, 216 sleeping,   0 stopped,   0 zombie
%cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.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
%cpu4  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

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

通过 cpuset-cpus 参数指定容器 A 使用 cpu 内核 0,容器 B 只是用 cpu 内核 1。在主机上只有这两个容器使用对应 cpu 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。在系统具有多个 cpu 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 cpu 内核才能方便地进行测试。

[root@docker stress]# docker run -tid --name cpu4 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
ec1076a777829139d1246f7d1ac66c56d39aa73ed87fa9b273ff5b184a332a76
[root@docker stress]# top
top - 19:41:56 up  5:59,  2 users,  load average: 1.01, 3.49, 6.19
Tasks: 219 total,   2 running, 217 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

[root@docker stress]# docker run -tid --name cpu5 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
a2f9694e9a87e4bd9f3e1f176d02fcb8b2b26a6ee4463fef88486f6f33fc4784
[root@docker stress]# top
top - 19:50:23 up  6:07,  2 users,  load average: 1.53, 1.60, 4.06
Tasks: 223 total,   3 running, 220 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
CONTAINER ID   NAME             cpu %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
ef3f85210952   cpu5             33.89%    216KiB / 3.683GiB   0.01%     656B / 0B   0B / 0B     2
a2f9694e9a87   cpu4             67.04%    124KiB / 3.683GiB   0.00%     656B / 0B   0B / 0B     2

六、内存限额

 与操作系统类似,容器可使用的内存包括两部分:物理内存和swap。

Docker通过下面两组参数来控制容器内存的使用量:

- m或-- memory: 设置内存的使用限额,例如100M、 1024M

- memory-swap:设置内存+swap的使用限额

#执行如下命令允许该容器最多使用200M的内存和300M 的swap。
[root@docker stress]# docker run -it -m 200M --memory-swap=300M centos:stress
--vm 1 --vm-bytes 280M
--vm1:启动1个内存工作线程
--vm-bytes 280M: 每个线程分配280M内存
[root@docker stress]# docker status		#另开终端动态查看
CONTAINER ID   NAME             cpu %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
2ea4735905de   stoic_shockley   0.00%     408KiB / 200MiB     0.20%     656B / 0B   0B / 0B     1
[root@docker stress]# docker run -it centos:stress
[root@docker stress]# docker status		#认无上限
CONTAINER ID   NAME               cpu %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
b408c6491ebe   laughing_maxwell   0.00%     400KiB / 3.683GiB   0.01%     656B / 0B   0B / 0B     1

七、Block IO的限制

认情况下,所有容器能平等地读写磁盘,可以通过设置**–blkio-weight**参数来改变容器blockI0的优先级。
–blkio-weight 与–cpu-shares 类似,设置的是相对权重值,认为500。
在下面的例子中,容器A读写磁盘的IO是容器B的两倍

[root@docker docker]# docker run -it --name container_A --blkio-weight 600 centos:stress
[root@5438aaa49750 /]# cat/sys/fs/cgroup/blkio/blkio.weight
600
[root@docker docker]# docker run -it --name container_A --blkio-weight 300 centos:stress
[root@5438aaa49750 /]# cat/sys/fs/cgroup/blkio/blkio.weight
300

八、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@docker 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

构建镜像时指定资源限制

参数详解
–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是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...