私有仓库建立
[root@docker1 ~]# docker pull registry
在docker 引擎终端设置
[root@docker1 ~]# vim /etc/docker/daemon.json
[root@docker1 ~]# systemctl restart docker.service
[root@docker1 ~]# docker create -it registry /bin/bash
b6f0c8419a6f18fe825144a3fc995b8e61a45249cb5002bb3211ed743bb23be6
[root@docker1 ~]# docker ps -a
会是异常状态
[root@docker1 ~]# docker start b6f0c8419a6f
b6f0c8419a6f
[root@docker1 ~]# docker ps -a
宿主机的/data/registry自动创建挂载容器中的/tmp/registry
[root@docker1 ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
68d2f9e0cb5f072acd2505b5117f1e342be98397d504dd9f0a1e7edb565aee38
[root@docker1 ~]# docker ps -a
更改标记为192.168.235.156:5000/nginx
[root@docker1 ~]# docker tag nginx:latest 192.168.235.156:5000/nginx
[root@docker1 ~]# docker images
上传
cgroup 资源配置方法
docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制
cgroup是controlgroup是的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所有的物理资源(如CPU、内存、磁盘、IO等等)的机制
CPU使用率控制
CPU周期:1s为一个周期的定律,参数值一般为100000(CPU衡量单位是秒)
CPU在一个时刻,只能给一个进程
使用stress 工具测试 CPU
[root@docker1 ~]# mkdir /opt/stress/
[root@docker1 ~]# vim /opt/stress/Dockerfile
FROM centos:7
RUN yum install -y wget
RUN wget -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
[root@docker1 stress]# docker build -t centos:stress .
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 查看资源使用
[root@docker1 stress]# cd /sys/fs/cgroup/cpu/docker/
[root@docker1 docker]# ls
[root@docker1 docker]# cat cpu.cfs_quota_us
-1
[root@docker1 docker]# cat cpu.cfs_period_us
100000
[root@docker1 docker]# docker run -itd --name centos_quota1 --cpu-period 100000 --cpu-quota 200000 centos:stress
3ac61f0562d3fe885ce4720ee2b171b6bd83e3693048866f045115f8e2907a2d
[root@docker1 docker]# cd 3ac61f0562d3fe885ce4720ee2b171b6bd83e3693048866f045115f8e2907a2d
[root@docker1 3ac61f0562d3fe885ce4720ee2b171b6bd83e3693048866f045115f8e2907a2d]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@docker1 3ac61f0562d3fe885ce4720ee2b171b6bd83e3693048866f045115f8e2907a2d]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
-1
[root@docker1 stress]# docker run -tid --name cpu2 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
0cccd64899f2944d2045c8522a70f6251b4b5a0f18520c633a19b8c31da1d16b
[root@docker1 stress]# top
top - 14:30:02 up 1 day, 9:58, 2 users, load average: 20.65, 18.86, 11.70
Tasks: 255 total, 23 running, 232 sleeping, 0 stopped, 0 zombie
%Cpu0 : 98.7 us, 1.3 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 : 97.7 us, 2.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 98.7 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861508 total, 317820 free, 941012 used, 2602676 buff/cache
KiB Swap: 4064252 total, 4063228 free, 1024 used. 2435380 avail Mem
[root@docker1 stress]# docker run -tid --name cpu3 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 132d4abc584b2e6ee16dbef10f0169546a6d5f27476912317a895a7ed48080597
[root@docker1 stress]# top
top - 14:31:34 up 1 day, 10:00, 2 users, load average: 21.50, 19.60, 12.66
Tasks: 259 total, 23 running, 236 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 : 95.0 us, 5.0 sy, 0.0 ni, 0.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 : 3861508 total, 311216 free, 946664 used, 2603628 buff/cache
KiB Swap: 4064252 total, 4063228 free, 1024 used. 2428952 avail Mem
内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和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
Block 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 ##再开一个终端看下
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@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
构建镜像时指定资源限制
--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指令的网络模式
小结
一、资源限制的主要类型
1、CPU 权重shares、quota、cpuset
2、磁盘 BPS 、TPS限制,指定使用哪个磁盘、磁盘分区
3、内存 -m -swap 内存、交换分区
二、资源限制的几种方式
1、build 构建镜像时,可以指定该镜像的资源限制
2、run 将镜像跑为容器的时候,可以指定容器的资源限制
3、容器启动之后,可以在宿主机对应容器的目录下。修改资源限制,然后重载
/sys/fs/cgroup/*(cpu、blk、mem) /docker/容器ID/ -->修改对应的资源限制文件参数就可以
三、资源限制的状态查询
1、docker inspect 镜像ID/容器ID
2、直接查看宿主机对应容器ID资源限制的文件