文章目录
一、私有仓库部署
docker pull registry
vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.27.137:5000"], ##添加,本地地址端口:5000
"registry-mirrors": ["https://zcwqh0wr.mirror.aliyuncs.com"]
}
systemctl restart docker
docker create -it registry /bin/bash
docker start b8829696b1eb
docker ps -a
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
docker ps -a
- 打上标签
[root@docker ~]# docker tag nginx:latest 192.168.27.127:5000/nginx ##打上标签
[root@docker ~]# docker push 192.168.27.127:5000/nginx
curl -XGET http://192.168.27.137:5000/v2/_catalog ##显示上传成功
{"repositories":["nginx"]}
docker rmi 192.168.27.137:5000/nginx
docker pull 192.168.27.137:5000/nginx ##下载
二、Cgroup资源
- Docker通过Cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
- Cgroup是ControlGroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如CPU、内存、磁盘I0等等)的机制
2.1CPU使用率
- stress压力测试工具测试cpu和内存使用情况
##使用Dockerfile来创建一个基于Centos的stress工具镜像
cd /opt
mkdir /opt/stress
cd 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
docker build -t centos:stress .
- 使用如下命令创建容器,命令中的–cpu-shares参数值不能保证可以获得1个vcpu或者多少GHz的CPU资源,它仅是一个弹性的加权值
[root@docker-lnmp stress]# docker run -itd --cpu-shares 100 centos:stress
b56ebe723deac667421caec76f2ccd7b23f608a59e0a30858c2603f37967c94f
2.2Cgroups-优先级/权重限制
- 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。可以通过cpu share 设置容器使用CPU 的优先级/权限,比如启动了两个容器及运行查看CPU使用百分比。
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 查看资源使用
2.3CPU周期限制
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,表示不做控制(不做任何限制)
- 查询容器的资源限制参数
cd /sys/fs/cgroup/cpu/docker/
cat cpu.cfs_quota_us
cat cpu.cfs_period_us
[root@docker ~]# docker run -itd --name centos_quota1 --cpu-period 100000 --cpu-quota 200000 centos:stress
696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc88350f
[root@docker docker]# cd 696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc88350f
[root@docker 696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc883
100000
[root@docker 696fa2811c61d7a70b587e5a350c155c35283be69a2dea85c9623cf0cc88350f]#
200000
- docker inspect centos_quota1 ##查询资源限制
2.4cpu core控制资源
对多核CPU的服务器,Docker 还可以控制容器运行使用哪些CPU内核,即使用–epuset-cpus参数。这对具有多CPU的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
两种控制资源的使用方式:
- 创建容器时直接使用参数指定资源限制
[root@docker ~]# docker run -itd --name cpu --cpuset-cpus 0-1 centos:stress
5f5b2d07e6bbb8655db6cef030c816282b5c0e8df2c0cd466d3d86c644f9303a
执行以上命令需要宿主机为双核,表示创建的容器只能用0/1两个内核,最终胜出的cgroup的
cpu内核配置如下:
[root@docker ~]# cd /sys/fs/cgroup/cpuset/docker/
[root@docker docker]# cd 5f5b2d07e6bbb8655db6cef030c816282b5c0e8df2c0cd466d3d86c644f9303a
[root@docker 5f5b2d07e6bbb8655db6cef030c816282b5c0e8df2c0cd466d3d86c644f9303a]# cat cpuset.cpus
0-1
在这里插入代码片
- 创建容器后,指定资源分配
修改宿主机对应容器资源控制的文件,位置:/sys/fs/cgroup/**目录下修改对应的文件参数
2.5cpu配额控制参数的混合使用
[root@docker stress]# docker run -tid --name cpu2 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
680a5d0d39bd69a5340d046313f896a6f514ad2d1ff78ce6d17dbc35315716ec
[root@localhost stress]# top ##记住按1查看每个核心的占用;结果显示占用cpu1的资源
top - 18:28:44 up 1:11, 2 users, load average: 0.70, 0.24, 0.22
Tasks: 233 total, 2 running, 231 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
%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
KiB Mem : 7990280 total, 4738804 free, 821800 used, 2429676 buff/cache
KiB Swap: 307196 total, 307196 free, 0 used. 6789000 avail Mem
[root@docker stress]# docker run -tid --name cpu3 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
4c0956d2f2301b1e08865ffd2b13708482b638a7478a2a7fa4d14b933cfefeb6
[root@localhost stress]# top ##记住按1查看每个核心的占用;结果显示占用cpu3的资源
top - 18:29:31 up 1:11, 2 users, load average: 0.86, 0.35, 0.25
Tasks: 236 total, 3 running, 233 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 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 :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 : 7990280 total, 4729164 free, 830364 used, 2430752 buff/cache
KiB Swap: 307196 total, 307196 free, 0 used. 6779532 avail Mem
-----------------》以上是不同的cpu
以下仍使用cpu3,查看资源使用情况
[root@docker stress]# docker run -tid --name cpu0 --cpuset-cpus 3 --cpu-shares 512 centos:stress stress -c 1 ##仍使用cpu3,
docker stats ##查看资源使用
2.6内存限额
- 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
默认情况下,容器可以使用主机上的所有空闲内存。
与CPU的cgroups 配置类似,Docker会自动为容器在目录/sys/ fs/ cgroup/ memory/docker/<容器的完整长WID>中创建相应cgroup 配
2.7Block 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 ##再开一个终端看下
2.8bps和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@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
- 限制容器写/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