docker镜像分层
docker分层
docker镜像的分层(使用的是kvm 链接克隆,写时复制的特性)
1:分层的好处:重复利用,节约资源
2:镜像越大,迁移时间越长;并且你如果使用docker做集群,那么如果镜像太大,
有变化,每个更新的话,都需要很长时间。所以最好是镜像分2-3层(基础系统-应用服务-代码),集群采预与下载。
查看分层镜像信息:(请注意missing - )
[root@server01 ~]# docker history nginx (--no-trunc) IMAGE CREATED CREATED BY SIZE COMMENT ae2feff98a0c 3 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 3 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B <missing> 3 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 3 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B <missing> 3 weeks ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB <missing> 3 weeks ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB <missing> 3 weeks ago /bin/sh -c #(nop) COPY file:e7e183879c35719c… 1.2kB <missing> 3 weeks ago /bin/sh -c set -x && addgroup --system -… 63.7MB <missing> 3 weeks ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B <missing> 3 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.5.0 0B <missing> 3 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.6 0B <missing> 3 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:3a7bff4e139bcacc5… 69.2MB
如何实现
至于容器如何获取镜像层文件而又不影响到是镜像层的呢?docker是这样实现的?
如果需要获取某个文件,那么容器曾会从上到下去下一层的镜像层去获取文件,如果该层文件不存在,那么就会去下一镜像层去寻找,直到最后一层。
对于用户而言,用户面向的是一个叠加后的文件系统。
而任何对于文件的操作都会记录在容器层,例如说修改文件,容器层会把在镜像层找到的文件拷贝到容器层然后进行修改,删除文件则会在容器层内记录删除文件的记录。
大概原理图:
前面我们基于centos镜像,一层一层做了几个镜像
注意:
实际制作镜像的时候,我们应该经量把会发生变化的层放在最后,这样前面的层就可以走缓冲。(比如下图:先制作httpd 和sshd, 先制作sshd和httpd的区别)
附上:
Docker 整体流程: