资源控制—Cgroup 创建私有仓库(registry)

创建私有仓库

下载registry镜像

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

指定镜像仓库地址

[root@localhost ~]# vim /etc/docker/daemon.json 
 
{
"insecure-registries": ["192.168.3.13:5000"],  #添加本机ip地址
  "registry-mirrors": ["https://eusc79iy.mirror.aliyuncs.com"]
}

[root@localhost ~]# systemctl restart docker.service

创建registry容器且开放端口

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS    PORTS     NAMES
f9264fa7d42a   registry   "/entrypoint.sh /bin…"   40 seconds ago   Created             nice_chandrasekhar
[root@localhost ~]# docker start f9264fa7d42a
f9264fa7d42a
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry ##-p指定端口,一内一外;-v表示挂载,前者是宿主机,后者是容器
e44077ab5b0741e8d872b5212574cb9a997ed61610e1368fa2e86aa3e300b4c6
[root@localhost ~]# docker tag nginx:latest 192.168.3.13:5000/nginx  

给镜像贴标签后上传

[root@localhost ~]# docker push 192.168.3.13:5000/nginx
Using default tag: latest
The push refers to repository [192.168.3.13:5000/nginx]
8525cde30b22: Pushed 
1e8ad06c81b6: Pushed 
49eeddd2150f: Pushed 
ff4c72779430: Pushed 
37380c5830fe: Pushed 
e1bbcf243d0e: Pushed 
latest: digest: sha256:2f14a471f2c2819a3faf88b72f56a0372ff5af4cb42ec45aab00c03ca5c9989f size: 1570

获取私有仓库列表查看是否上传成功

[root@localhost ~]# curl -XGET http://192.168.3.13:5000/v2/_catalog  #格式很重要
{"repositories":["nginx"]}

从私有仓库下载镜像

[root@localhost ~]# docker images  #先查看所有镜像,有创建的私有镜像
REPOSITORY                TAG       IMAGE ID       CREATED        SIZE
192.168.3.13:5000/nginx   latest    ea335eea17ab   2 weeks ago    141MB
nginx                     latest    ea335eea17ab   2 weeks ago    141MB
registry                  latest    b8604a3fe854   2 weeks ago    26.2MB
hello-world               latest    feb5d9fea6a5   2 months ago   13.3kB
centos                    7         eeb6ee3f44bd   2 months ago   204MB
centos                    latest    5d0da3dc9764   2 months ago   231MB
[root@localhost ~]# docker rmi 192.168.3.13:5000/nginx:latest   #删除掉创建的镜像
Untagged: 192.168.3.13:5000/nginx:latest
Untagged: 192.168.3.13:5000/nginx@sha256:2f14a471f2c2819a3faf88b72f56a0372ff5af4cb42ec45aab00c03ca5c9989f
[root@localhost ~]# docker images  #查看
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    ea335eea17ab   2 weeks ago    141MB
registry      latest    b8604a3fe854   2 weeks ago    26.2MB
hello-world   latest    feb5d9fea6a5   2 months ago   13.3kB
centos        7         eeb6ee3f44bd   2 months ago   204MB
centos        latest    5d0da3dc9764   2 months ago   231MB
[root@localhost ~]# docker pull 192.168.3.13:5000/nginx  #下载
Using default tag: latest
latest: Pulling from nginx
Digest: sha256:2f14a471f2c2819a3faf88b72f56a0372ff5af4cb42ec45aab00c03ca5c9989f
Status: Downloaded newer image for 192.168.3.13:5000/nginx:latest
192.168.3.13:5000/nginx:latest
[root@localhost ~]# docker images  #查看
REPOSITORY                TAG       IMAGE ID       CREATED        SIZE
192.168.3.13:5000/nginx   latest    ea335eea17ab   2 weeks ago    141MB
nginx                     latest    ea335eea17ab   2 weeks ago    141MB
registry                  latest    b8604a3fe854   2 weeks ago    26.2MB
hello-world               latest    feb5d9fea6a5   2 months ago   13.3kB
centos                    7         eeb6ee3f44bd   2 months ago   204MB
centos                    latest    5d0da3dc9764   2 months ago   231MB

资源控制(Cgroup)

Cgroup 是 Control group 的简写,是 Linux 内核提供的一种限制所使用物理资源的机制,包括 CPU、内存 和 IO 这三大方面,基本覆盖了常见的资源配额和使用量控制

对CPU的控制

  • 使用stress工具测试
[root@localhost ~]# mkdir /opt/stress
[root@localhost ~]# vim /opt/stress/Dockerfile

FROM centos:7
RUN yum install -y wget
RUN wget -O /etc/yum.rpos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install stress

[root@localhost ~]# cd /opt/stress/
[root@localhost stress]# systemctl restart docker.service 
[root@localhost stress]# docker build -t centos:stress .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/4 : RUN yum install -y wget
 ---> Running in 8c3d27deff77
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.163.com
...
Complete!
Removing intermediate container 38673c7a558b
 ---> 66e115612ff8
Successfully built 66e115612ff8
Successfully tagged centos:stress

在这里插入图片描述
在这里插入图片描述

限制 CPU 使用周期速率

查看CPU的资源限制
命令格式:
cat /sys/fs/cgroup/cpu/docker/[容器ID]/cpu.cfs_quota_us
[root@localhost stress]# docker run -itd --name test2 centos:7 /bin/bash
9d3d07585815ef092eb42ece50218ccb701e112d721c6e17404eed00e76fd9e6
[root@localhost stress]# cat /sys/fs/cgroup/cpu/docker/9d3d07585815ef092eb42ece50218ccb701e112d721c6e17404eed00e76fd9e6/cpu.cfs_quota_us
-1  #-1不进行任何限制
# 手动修改文件去实现修改cpu限制
[root@localhost stress]# echo 20000 > /sys/fs/cgroup/cpu/docker/9d3d07585815ef092eb42ece50218ccb701e112d721c6e17404eed00e76fd9e6/cpu.cfs_quota_us
[root@localhost stress]# cat /sys/fs/cgroup/cpu/docker/9d3d07585815ef092eb42ece50218ccb701e112d721c6e17404eed00e76fd9e6/cpu.cfs_quota_us
20000

# 在运行容器的同时指定
以下这两个参数一般联合使用,控制容器可以分配到的cpu时钟周期
--cpu-period是用来指定容器对cpu的使用要在多长时间内做一次重新分配
--cpu-quota是用来指定这个周期内,最多可以用有多少时间来跑这个容器

‘容器进程需要每秒使用单个CPU的0.2秒时间,可以将period设为1000000(1s)’
‘若在多核情况下,允许容器进程完全占用两个CPU,可以将period设置为100000(0.1s)’
[root@localhost stress]# docker run -itd --name cpu01 --cpu-period =100000 --cpu-quota=200000 centos:stress^C
[root@localhost stress]# docker run -itd --name cpu01 --cpu-period=100000 --cpu-quota=200000 centos:stress
64fe34e0b9c5e0efb429fdde59ef66d7f7d4b0a266027e514329ce16131a5e8f
[root@localhost stress]# docker exec -it 64fe34e0b9c5e0efb429fdde59ef66d7f7d4b0a266027e514329ce16131a5e8f bash
[root@64fe34e0b9c5 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@64fe34e0b9c5 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

### 多任务比例分享 CPU
当有多个容器任务同时运行时,很难计算 CPU 的使用率,我们可以设置 CPU 按照比例共享 CPU 资源,以实现使用率的动态调整
```shell
root@localhost stress]# docker run -itd --name cpu111 --cpu-shares 1024 centos:stress stress -c 10		#-c 10表示产生10个子线程,测试用
624954cbbc38df08422edcd4e4e1f28708e4d098e4baceea83fe1632a17c0784
[root@localhost stress]# docker exec -it 624 bash
[root@624954cbbc38 /]# top		#查看CPU使用率

--新开一个终端--
[root@localhost stress]# docker exec beb1fe52cf42a08846df0bab15d031f7499ab57a9817b6b6f065848654ccf214 bash
[root@localhost stress]# docker exec -it beb1fe52cf42a08846df0bab15d031f7499ab57a9817b6b6f065848654ccf214 bash
[root@6d32a73b608b /]# top		#对比CPU使用率,是1:2

在这里插入图片描述

在这里插入图片描述

使用【–cpu-shares】,分配两个容器使用CPU资源占用权重为1:2

默认情况下,每个Docker容器的CPU份额都是1024,单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器CPU的加权效果才能体现出来
比如以上的两个容器是1:2,在CPU进行时间片分配时,后者比前者多一倍的机会获得CPU的时间片,但是分配的结果取决于当时主机和其他容器的运行状态
实际上也无法保证该容器一定获得相应的CPU时间片,因为若是该的进程一直是空闲的,那么cpu1就可以获取比cpu2更多的CPU时间片
在极端情况下,例如主机上只运行了一个容器,即使它的CPU份额较小,也是可以独占整个主机的CPU资源的
Cgroups只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效,因此,无法根据某个容器的CPU份额来确定有多少CPU资源分给给它
即资源分配的结果取决于同时运行的其他容器CPU分配和容器中进程的运行情况

限制 CPU 内核使用

可以通过配置,使得某些程序独享 CPU 内核,以提高其处理速度

[root@localhost ~]# cat /sys/fs/cgroup/cpuset/docker/d00a2563e936dd1198a80869efaf5d7d2b5c4d751d5bec4e80a6bdfdbbfcfd8c/cpuset.cpus
0-7
#若该服务器有8个核心,那么CPU编号为0-7,表示该容器内的进程在核心上皆可运行,这是默认配置'
#可查看/proc/cpuinfo中的CPU编号(processor)

--
[root@localhost ~]# docker run -itd --name a1 --cpuset-cpus 0-1 centos:7
#表示创建的容器只能使用0、1两个内核,其后可以使用top命令按1查看CPU使用

--
[root@localhost ~]# docker exec [容器ID] taskset -c -p 1			#表示绑定至指定CPU上运行
  • 在实际使用中,尽量使用绑定内核的方式分配 CPU 资源,然后再配合【–cpu-share】选项来动态调整 CPU 使用资源的比例
    住意,这里若是两个容器各自指定不同的CPU内核,则–cpu-share基本没有效果

对内存使用的限制

'与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap'
'-m 或 --memory:设置内存的使用限额'
'--memory-swap:设置内存+swap 的使用限额'

--
docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
#--vm 1:启动1个内存工作线程'
#--vm-bytes 280M:每个线程分配280M内存'

--
#相应的Cgroup配置文件:/sys/fs/cgroup/memory/memory.limit_in_bytes

docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
#如果让工作线程分配的内存超过300M,分配的内存超过了限额,stress线程会报错,容器退出

--
'注意!一旦容器Cgroup使用的内存超过了限制的容量,Linux内核就会尝试收回这些内存'
'如果仍旧无法控制内存使用在这个设置的范围之内,就会杀死该进程!'

对磁盘 IO 资源的限制

如果实在一台服务器上进行容器的混合部署,那么可能会出现同时有几个程序写磁盘数据的情况,那么如何进行限制呢?

bps:byte per second(每秒读写的字节数)
iops:io per second(每秒IO的次数)

--
1.限制某个程序写入的bps数据量
docker run -d --device-write-bps /dev/sda:30M centos:7


2.限制读取某个程序的bps数据量
docker run -d --device-read-bps /dev/sda:30M centos:7


3.限制读取某个程序的iops次数
--device-read-iops


4.限制写入某个程序的iops次数
--device-write-iops
例:限制容器写 /dev/sda 的速率为 5MB/s
[root@docker ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@0c729425a662 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct		
#dd复制,从zero拿文件test,每次拿1MB,写1024次即1GB大小
oflag=direct表示指定用direct IO 方式写文件,这样--device-write-bps才能生效
^C53+0 records in		#ctrl+c中途退出
53+0 records out
55574528 bytes (56 MB) copied, 10.6067 s, 5.2 MB/s
结果显示为5.2MB,以下再来对比测试一下不限速的
[root@0c729425a662 /]# exit
exit
[root@docker ~]# 
[root@docker ~]# docker run -it centos:stress
[root@8640cab42b0a /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.66132 s, 293 MB/s

总结
1、资源限制的主要类型
CPU权重shares、 quota、 cpuset
磁盘BPS、 TPS限制, 指定使用哪个磁盘、磁盘分区
内存 -m - swap 内存、交换分区
大部分做的是上限的限制
2、资源限制的几种方式
build构建镜像时,可以指定该镜像的资源限制
run将镜像跑为容器的时候,可以指定容器的资源限制
容器启动之后可以在宿主机对应容器的目录下,修改资源限制,然后重载
/sys/ fs/cgroup/* (cpu、b1k、 mem) /docker/容 器ID/ ——>修改对应的资源限制文件参数就可以
3、资源限制的状态查询
docker inspect 镜像ID/容器ID

直接查看宿主机对应容器ID资源限制的文件

cgroup资源docker 原理之一, namespaces 6个名称空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值