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资源控制