文章目录
创建私有仓库
下载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个名称空间