目录
一、私有仓库建立
1.下载私有仓库
[root@docker ~]# mkdir docker
[root@docker docker]# cd docker
[root@docker docker]# 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
2.下载镜像
[root@docker docker]# docker pull Nginx #下载所需的镜像
Using default tag: latest
latest: Pulling from library/Nginx
e5ae68f74026: Pull complete
21e0df283cd6: Pull complete
ed835de16acd: Pull complete
881ff011f1c9: Pull complete
77700c52c969: Pull complete
44be98c0fab6: Pull complete
Digest: sha256:4a49b1fbd5f544755121dee04f7f717416c21ae1bf5ef862aa34fbffbb9e434f
Status: Downloaded newer image for Nginx:latest
docker.io/library/Nginx:latest
[root@docker docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Nginx latest f652ca386ed1 19 hours ago 141MB
registry latest b8604a3fe854 2 weeks ago 26.2MB
3.配置docker引擎终端
[root@docker docker]# vim /etc/docker/daemon.json #新创建一个新的.json文件
{
"insecure-registries":["192.168.150.10:5000"],
"registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
}
[root@docker docker]# systemctl restart docker.service #重启服务
4.挂载容器和守护进程
[root@docker docker]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
63c1414bcc8b338210b104bf505f6670a2023e7c0d2d55a945aeae2672883424
[root@docker docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63c1414bcc8b registry "/entrypoint.sh /etc…" 54 seconds ago Up 53 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp competent_kowalevski
5.镜像上传镜像仓库
[root@docker docker]# docker push 192.168.150.10:5000/Nginx
Using default tag: latest
The push refers to repository [192.168.150.10:5000/Nginx]
2bed47a66c07: Pushed
82caad489ad7: Pushed
d3e1dca44e82: Pushed
c9fcd9c6ced8: Pushed
0664b7821b60: Pushed
9321ff862abb: Pushed
latest: digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47 size: 1570
[root@docker docker]# curl -XGET http://192.168.150.10:5000/v2/_catalog #用字符查看镜像
{"repositories":["Nginx"]}
6.私有仓库下载
[root@docker docker]# docker pull 192.168.150.10:5000/Nginx
Using default tag: latest
latest: Pulling from Nginx
Digest: sha256:4424e31f2c366108433ecca7890ad527b243361577180dfd9a5bb36e828abf47
Status: Image is up to date for 192.168.150.10:5000/Nginx:latest
192.168.150.10:5000/Nginx:latest
二、Cgroup 资源
Docker通过Cgroup来控制容器使用的资源配额,包括cpu、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
Cgroup是ControlGroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如cpu、内存、磁盘I0等等)的机制
1.cpu使用率控制
cpu周期: 1s为一个周期的定律,参数值一般为100000 (cpu衡量单位是秒)
假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s。cpu在一个时刻,只能给一个进程占用
2.用stress压力测试工具测试cpu和内存使用情况
[root@docker docker]# mkdir /opt/stress
[root@docker docker]# cd 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-lnmp stress]# docker build -t centos:stress .
[root@docker stress]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos stress 7037090ec672 14 seconds ago 541MB
3.Cgroups-优先级/权重限制
只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。可以通过cpu share 设置容器使用cpu 的优先级/权限,比如启动了两个容器及运行查看cpu使用百分比。
[root@docker stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10 #容器内部模拟10个子函数进程
[root@docker stress]# docker stats #动态查看容器的资源的使用量
CONTAINER ID NAME cpu % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
234fd1982b27 cpu512 802.49% 336KiB / 3.683GiB 0.01% 656B / 0B 0B / 0B 11
[root@docker stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10 #再开启一个容器做比较
[root@docker stress]# docker stats #动态查看容器的资源的使用量
CONTAINER ID NAME cpu % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a3d1c7297cdd cpu1024 545.16% 340KiB / 3.683GiB 0.01% 656B / 0B 0B / 0B 11
234fd1982b27 cpu512 252.19% 336KiB / 3.683GiB 0.01% 656B / 0B 0B / 0B 11
三、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.操作实例
例如:容器进程需要每1秒使用单个cpu的0.2秒时间,可以将cpu-period 设置为1000000 (即1秒),cpu-quota 设置为200000 (0.2秒)。
当然,在多核情况下,如果允许容器进程完全占用两个cpu, 则可以将cpu-period 设置为100000 (即0.1d秒),cpu-quota设置为200000 (0.2 秒)。
[root@docker docker]# docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
ad2286f200e2d7a12a6ed4493c85c4f60ef14d0cb8e1187d290f3b98d584f729
[root@docker docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad2286f200e2 centos:stress "/bin/bash" 9 seconds ago Up 8 seconds upbeat_perlman
[root@docker docker]# docker exec -it ad2286f200e2 bash #进入容器
2.查询容器的资源
[root@ad2286f200e2 /]# cd /sys/fs/cgroup/cpu
[root@ad2286f200e2 cpu]# ls
cgroup.clone_children cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat cpuacct.usage notify_on_release
cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares cpuacct.stat cpuacct.usage_percpu tasks
[root@ad2286f200e2 cpu]# cat cpu.cfs_period_us
100000
[root@ad2286f200e2 cpu]# cat cpu.cfs_quota_us
200000
四、cpu Core 控制
对多核 cpu 的服务器,Docker 还可以控制容器运行使用哪些 cpu 内核,即使用--cpuset-cpus 参数。这对具有多 cpu 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
1.创建的容器
只能用 0、1两个内核。最终生成 的 cgroup 的 cpu 内核
[root@docker stress]# docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress
c4c808b2ee9b8bfc9ebdeb2bee77f569ac40fb0243cf01b7919fd045fb37f7ec
[root@docker stress]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4c808b2ee9b centos:stress "/bin/bash" About a minute ago Up About a minute cpu1
2.查看核心占用
使用下面的命令把容器中进程与 cpu 内核的绑定关系,达到绑定 cpu 内核的目的。
[root@docker stress]# docker exec -it cpu1 /bin/bash -c "stress -c 10 "
stress: info: [26] dispatching hogs: 10 cpu, 0 io, 0 vm, 0 hdd
[root@localhost stress]# top #记住按1查看每个核心的占用(只有cpu0和cpu1在工作)
Tasks: 227 total, 11 running, 216 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 : 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
%cpu4 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%cpu5 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
五、cpu配额控制参数的混合使用
通过 cpuset-cpus 参数指定容器 A 使用 cpu 内核 0,容器 B 只是用 cpu 内核 1。在主机上只有这两个容器使用对应 cpu 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。在系统具有多个 cpu 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 cpu 内核才能方便地进行测试。
[root@docker stress]# docker run -tid --name cpu4 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
ec1076a777829139d1246f7d1ac66c56d39aa73ed87fa9b273ff5b184a332a76
[root@docker stress]# top
top - 19:41:56 up 5:59, 2 users, load average: 1.01, 3.49, 6.19
Tasks: 219 total, 2 running, 217 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
[root@docker stress]# docker run -tid --name cpu5 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
a2f9694e9a87e4bd9f3e1f176d02fcb8b2b26a6ee4463fef88486f6f33fc4784
[root@docker stress]# top
top - 19:50:23 up 6:07, 2 users, load average: 1.53, 1.60, 4.06
Tasks: 223 total, 3 running, 220 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
CONTAINER ID NAME cpu % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ef3f85210952 cpu5 33.89% 216KiB / 3.683GiB 0.01% 656B / 0B 0B / 0B 2
a2f9694e9a87 cpu4 67.04% 124KiB / 3.683GiB 0.00% 656B / 0B 0B / 0B 2
六、内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和swap。
Docker通过下面两组参数来控制容器内存的使用量:
- m或-- memory: 设置内存的使用限额,例如100M、 1024M
- memory-swap:设置内存+swap的使用限额
#执行如下命令允许该容器最多使用200M的内存和300M 的swap。
[root@docker stress]# docker run -it -m 200M --memory-swap=300M centos:stress
--vm 1 --vm-bytes 280M
--vm1:启动1个内存工作线程
--vm-bytes 280M: 每个线程分配280M内存
[root@docker stress]# docker status #另开终端动态查看
CONTAINER ID NAME cpu % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2ea4735905de stoic_shockley 0.00% 408KiB / 200MiB 0.20% 656B / 0B 0B / 0B 1
[root@docker stress]# docker run -it centos:stress
[root@docker stress]# docker status #默认无上限
CONTAINER ID NAME cpu % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b408c6491ebe laughing_maxwell 0.00% 400KiB / 3.683GiB 0.01% 656B / 0B 0B / 0B 1
七、Block IO的限制
默认情况下,所有容器能平等地读写磁盘,可以通过设置**–blkio-weight**参数来改变容器blockI0的优先级。
–blkio-weight 与–cpu-shares 类似,设置的是相对权重值,默认为500。
在下面的例子中,容器A读写磁盘的IO是容器B的两倍
[root@docker docker]# docker run -it --name container_A --blkio-weight 600 centos:stress
[root@5438aaa49750 /]# cat/sys/fs/cgroup/blkio/blkio.weight
600
[root@docker docker]# docker run -it --name container_A --blkio-weight 300 centos:stress
[root@5438aaa49750 /]# cat/sys/fs/cgroup/blkio/blkio.weight
300
八、bps和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@docker 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
构建镜像时指定资源限制
参数 | 详解 |
---|---|
–build-arg=[ ] | 设置镜像创建时的变量 |
–cpu-shares | 设置cpu使用权重 |
—cpu-period | 限制cpu CFS周期 |
–cpu-quota | 限制cpu CFS配额 |
–cpuset-cpus | 指定使用的cpuid |
–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指令的网络模式