理解Docker镜像分层 (3)

从最上层镜像开始查找,往下找,找到文件后读取并放入内容,若已经在内存中了,直接使用。(即,同一台机器上运行的docker容器共享运行时相同的文件)。

当容器需要添加文件的时候

直接在最上面的容器层可写层添加文件,不会影响镜像层。

当容器需要修改文件的时候

从上往下层寻找文件,找到后,复制到容器可写层,然后,对容器来说,可以看到的是容器层的这个文件,看不到镜像层里的文件。容器在容器层修改这个文件。

当容器需要删除文件的时候

从上往下层寻找文件,找到后在容器中记录删除。即,并不会真正的删除文件,而是软删除。这将导致镜像体积只会增加,不会减少。

综上,Docker镜像通过分层实现了资源共享,通过copy-on-write实现了文件隔离。

对于文件只增加不减少问题,我们应当在同一层做增删操作,从而减少镜像体积。比如,如下测试。

Dockerfile.A: 分层删除文件

FROM centos:7 RUN yum install -y vim RUN yum install -y httpd WORKDIR /home RUN dd if=http://www.likecs.com/dev/zero of=50M.file bs=1M count=50 #创建大小为50M的测试文件 RUN rm -rf 50M.file CMD ["/bin/bash"]

构建

docker build -t test:a -f Dockerfile.A .

Dockerfile.B: 同层删除

FROM centos:7 RUN yum install -y vim RUN yum install -y httpd WORKDIR /home RUN dd if=http://www.likecs.com/dev/zero of=50M.file bs=1M count=50 && rm -rf 50M.file

构建

docker build -t test:b -f Dockerfile.B .

比较二者大小

[root@sh-k8s-001 tmp]# docker images | grep test test a ae673aa7db48 9 minutes ago 497MB test b 21b2bc49f0bd 12 minutes ago 444MB

显然,分层删除操作并没有真正删除掉文件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwgyf.html