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

Posted 龙少。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker私有仓库registry和cgroup资源限制相关的知识,希望对你有一定的参考价值。

私有仓库registry和cgroup资源限制

一.私有仓库registry的建立

[root@docker ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
6a428f9f83b0: Pull complete 
90cad49de35d: Pull complete 
b215d0b40846: Pull complete 
429305b6c15c: Pull complete 
6f7e10a4e907: Pull complete 
Digest: sha256:265d4a5ed8bf0df27d1107edb00b70e658ee9aa5acb3f37336c5a17db634481e
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
您在 /var/spool/mail/root 中有新邮件
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
tomcat       test      d6598c118ba0   3 days ago      599MB
nginx        new       8cc8975756f1   3 days ago      681MB
nginx        latest    822b7ec2aaf2   9 days ago      133MB
registry     latest    b2cb11db9d3d   11 days ago     26.2MB
centos       latest    300e315adb2f   9 months ago    209MB
centos       7         8652b9f0cb4c   10 months ago   204MB

在docker引擎终端设置

[root@docker ~]# vim /etc/docker/daemon.json


  "insecure-registries":["192.168.206.188:5000"],			#添加,本地地址端口:5000
  "registry-mirrors": ["https://3zj1eww1.mirror.aliyuncs.com"]



[root@docker ~]# docker create -it registry /bin/bash
6df1f2798d6941741ccf87a2180334298914136fa00f88787df0753b4a011094
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS    PORTS     NAMES
6df1f2798d69   registry   "/entrypoint.sh /bin…"   8 seconds ago   Created             stoic_feynman
[root@docker ~]# docker start 6df1f2798d69
d6df1f2798d69
[root@docker ~]# docker ps -a								#查询状态 异常退出
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS                       PORTS     NAMES
6df1f2798d69   registry   "/entrypoint.sh /bin…"   42 seconds ago   Exited (127) 3 seconds ago             stoic_feynman

宿主机的 /data/registry 自动创建挂载容器中的 /tmp/registry

[root@docker ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
a5db7ad91a83e1fa117fdd422f46fcfb74296e1c9e2687197880d40200679c4b
您在 /var/spool/mail/root 中有邮件
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS                       PORTS                                       NAMES
a5db7ad91a83   registry   "/entrypoint.sh /etc…"   13 seconds ago   Up 11 seconds                0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   interesting_archimedes
6df1f2798d69   registry   "/entrypoint.sh /bin…"   3 minutes ago    Exited (127) 2 minutes ago                                               stoic_feynman
[root@docker ~]# 

更改nginx标签

[root@docker ~]# docker tag nginx:latest 192.168.206.188:5000/nginx
您在 /var/spool/mail/root 中有邮件
[root@docker ~]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED         SIZE
tomcat                       test      d6598c118ba0   5 days ago      599MB
nginx                        new       8cc8975756f1   5 days ago      681MB
192.168.206.188:5000/nginx   latest    822b7ec2aaf2   11 days ago     133MB
nginx                        latest    822b7ec2aaf2   11 days ago     133MB
registry                     latest    b2cb11db9d3d   13 days ago     26.2MB
centos                       latest    300e315adb2f   9 months ago    209MB
centos                       7         8652b9f0cb4c   10 months ago   204MB

上传nginx镜像

[root@docker ~]# docker push 192.168.206.188:5000/nginx
Using default tag: latest
The push refers to repository [192.168.206.188:5000/nginx]
d47e4d19ddec: Pushed 
8e58314e4a4f: Pushed 
ed94af62a494: Pushed 
875b5b50454b: Pushed 
63b5f2c0d071: Pushed 
d000633a5681: Pushed 
latest: digest: sha256:6bf47794f923462389f5a2cda49cf5777f736db8563edc3ff78fb9d87e6e22ec size: 1570

获取私有仓库列表

[root@docker ~]# curl -XGET http://192.168.206.188:5000/v2/_catalog
"repositories":["nginx"]
您在 /var/spool/mail/root 中有邮件

测试私有仓库下载

先删除镜像

[root@docker ~]# docker rmi 192.168.206.188:5000/nginx
Untagged: 192.168.206.188:5000/nginx:latest
Untagged: 192.168.206.188:5000/nginx@sha256:6bf47794f923462389f5a2cda49cf5777f736db8563edc3ff78fb9d87e6e22ec

重新下载

[root@docker ~]# docker pull 192.168.206.188:5000/nginx
Using default tag: latest
latest: Pulling from nginx
Digest: sha256:6bf47794f923462389f5a2cda49cf5777f736db8563edc3ff78fb9d87e6e22ec
Status: Downloaded newer image for 192.168.206.188:5000/nginx:latest
192.168.206.188:5000/nginx:latest
[root@docker ~]# 

二.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 ~]# mkdir /opt/stress
[root@docker ~]# cd /opt/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 stress]# docker build -t centos:stress .

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

[root@docker stress]# docker run -itd --cpu-shares 100 centos:stress
1abb75ec906f522222e32163b05c8a5bca3151809f80298a0f044972ae355e07

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

举例说明:
例如,两个容器A、B的CPU份额分别为1000和500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的CPU份额只有50,它也可以独占整个主机的CPU资源。

2.cgroup优先级权重限制

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

[root@docker stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10			#容器内部模拟10个子函数进程
41604c1b0b0fcf1810c79d40df0028479da5cbb48a21c3a4424bf1035bb4e769

[root@docker stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10		#再开启一个容器做比较
0a3a14fa37a05d9a286701903ea34cf848e34e1cf8b9b1efbffd166320c45d91		

[root@docker stress]# 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种:

(1)查询容器的资源限制参数

[root@docker ~]# cd /sys/fs/cgroup/cpu/docker/
[root@docker docker]# ls
0a3a14fa37a05d9a286701903ea34cf848e34e1cf8b9b1efbffd166320c45d91  a5db7ad91a83e1fa117fdd422f46fcfb74296e1c9e2687197880d40200679c4b  cgroup.procs   cpuacct.usage_percpu  cpu.rt_period_us   cpu.stat
1abb75ec906f522222e32163b05c8a5bca3151809f80298a0f044972ae355e07  cgroup.clone_children                                             cpuacct.stat   cpu.cfs_period_us     cpu.rt_runtime_us  notify_on_release
41604c1b0b0fcf1810c79d40df0028479da5cbb48a21c3a4424bf1035bb4e769  cgroup.event_control                                              cpuacct.usage  cpu.cfs_quota_us      cpu.shares         tasks
[root@docker docker]# cat cpu.cfs_quota_us
-1
[root@docker docker]# cat cpu.cfs_period_us
100000
[root@docker docker]# 


举例

[root@docker docker]# docker run -itd --name centos_quota1 --cpu-period 100000 --cpu-quota 200000 centos:stress
0c1a74ac89dfec0583d8b63792bb0ad623b73e0ca6bc779db74fad7be45f7bf9
您在 /var/spool/mail/root 中有邮件
[root@docker docker]# cd 0c1a74ac89dfec0583d8b63792bb0ad623b73e0ca6bc779db74fad7be45f7bf9
[root@docker 0c1a74ac89dfec0583d8b63792bb0ad623b73e0ca6bc779db74fad7be45f7bf9]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
您在 /var/spool/mail/root 中有邮件
[root@docker 0c1a74ac89dfec0583d8b63792bb0ad623b73e0ca6bc779db74fad7be45f7bf9]# cat cpu.cfs_period_us
100000
[root@docker 0c1a74ac89dfec0583d8b63792bb0ad623b73e0ca6bc779db74fad7be45f7bf9]# cat cpu.cfs_quota_us
200000
[root@docker 0c1a74ac89dfec0583d8b63792bb0ad623b73e0ca6bc779db74fad7be45f7bf9]# 

(2)查询资源限制
docker inspect centos_quota1

[root@docker ~]# 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
b2b285914db54cb281e4e0bf0369282083e3a59b6103e6f537e1a8a7afccaaba

执行以上命令需要宿主机为双核,表示创建的容器只能用0/1两个内核,最终胜出的cgroup的cpu内核配置如下

[root@docker ~]# cd /sys/fs/cgroup/cpuset/docker/
[root@docker docker]# cd b2b285914db54cb281e4e0bf0369282083e3a59b6103e6f537e1a8a7afccaaba/
[root@docker b2b285914db54cb281e4e0bf0369282083e3a59b6103e6f537e1a8a7afccaaba]# cat cpuset.cpus
0-1

(2)创建容器后,指定资源分配
修改宿主机对应容器资源控制的文件,位置:/sys/fs/cgroup/**目录下修改对应的文件参数

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

通过cpuset-cpus 参数指定容器A使用CPU内核0,容器B只使用CPU内核1。

[root@docker ~]# docker run -tid --name cpu2 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
a607fd6519f6831d4ada12b9c6fcac3b9daed2ec65a42bbf3c5349a2be77a441
[root@docker ~]# top					#按1查看每个核心的占用;结果显示占用cpu1的资源
top - 00:26:55 up 1 day,  9:35,  1 user,  load average: 21.00, 20.45, 20.35
Tasks: 227 total,  22 running, 205 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  : 99.7 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu2  : 99.7 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu3  : 99.3 us,  0.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863248 total,   173904 free,   526716 used,  1162628 buff/cache
KiB Swap:  2097148 total,  2066940 free,    30208 used.   916000 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                    
115802 root      20   0    7312    100      0 R  98.3  0.0   1:19.82 stress                                                                                                                                     
110952 root      20   0    7312     96      0 R  24.5  0.0  28:49.24 stress                                                                                                                                     
110954 root      20   0    7312     96      0 R  22.2  0.0  28:41.85 stress                                                                                                                                     
110953 root      20   0    7312     96      0 R  21.9  0.0  28:45.36 stress                                                                                                                                     
110955 root      20   0    7312     96      0 R  21.5  0.0  28:37.50 stress                                                                                                                                     
110960 root      20   0    7312     96      0 R  20.2  0.0  28:23.86 stress           

[root@docker ~]# docker run -tid --name cpu3 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
d29fbd4dce3f265288e6f7b239783dbeed527dde7857533d2f660342a9339c58
[root@docker ~]# top					#按1查看每个核心的占用;结果显示占用cpu1的资源
top - 00:28:09 up 1 day,  9:36,  1 user,  load average: 21.72, 20.83, 20.49
Tasks: 239 total,  25 running, 214 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  : 98.9 us,  1.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 98.9 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  1.1 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 :  1863248 total,   157524 free,   540004 used,  1165720 buff/cache
KiB Swap:  2097148 total,  2066940 free,    30208 used.   901428 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                    
115952 root      20   0    7312    100      0 R  98.9  0.0   0:25.67 stress                                                                                                                                     
115802 root      20   0    7312    100      0 R  69.9  0.0   2:24.27 stress                                                                                                                                     
110961 root      20   0    7312     96      0 R  19.4  0.0  28:50.42 stress                                                                                                                                     
110953 root      20   0    7312     96      0 R  18.3  0.0  29:00.07 stress                                                                                                                                     
110960 root      20   0    7312     96      0 R  18.3  0.0  28:38.13 stress                                                                                                                                     
110956 root      20   0    7312     96      0 R  17.2  0.0  28:55.38 stress  
                 

以上是不同的cpu
以下仍使用cpu3,查看资源使用情况

[root@docker ~]# docker run -tid --name cpu0 --cpuset-cpus 3 --cpu-shares 512 centos:stress stress -c 1
f730cb70fcb93e2b8d94564cc4f517ea8417e6d8ff6e5cc8a2143f9725a0687a
[root@docker ~]# docker stats

6.内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和Swap。
Docker通过下面两组参数来控制容器内存的使用量。
-m或–memory: 设置内存的使用限额,例如100M、 1024M

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

执行如下命令允许该容器最多使用200M的内存和300M 的swap

[root@docker ~]# docker run -it -m 200M --memory-swap=300M centos:stress
[root@22133b8ffdd2 /]# 

默认情况下,容器可以使用主机上的所有空闲内存。
与CPU的cgroups 配置类似,Docker 会自动为容器在目录 /sys/fs/cgroup/memory/docker/<容器的完整长 ID>中创建相应cgroup配置文件

[root@docker ~]# docker stats

7.block io限制

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

分别单独开终端

[root@docker ~]# docker run -it -m 200M --memory-swap=300M centos:stress
[root@c188853ba01b /]# 

[root@docker ~]# docker run -it --name container_02 --blkio-weight 300 centos:stress
[root@74b5ce8fbaf9 /]# 

查看

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@docker ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@eeb1c7e144df /]# dd if=/dev/zero of=test bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 2.02323 s, 5.2 MB/s

(2)限制容器写/dev/sda 的速率为10MB/s

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

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

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

Docker私有仓库之registry与Cgroup资源控制

Docker私有仓库之registry与Cgroup资源控制

Docker私有仓库之registry与Cgroup资源控制