从最上层镜像开始查找,往下找,找到文件后读取并放入内容,若已经在内存中了,直接使用。(即,同一台机器上运行的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显然,分层删除操作并没有真正删除掉文件。