来自Docker文档:
Docker镜像是只读的。当Docker从镜像运行容器时,它会在运行应用程序的镜像(使用UnionFS)上添加一个读写层。
如何跨层协调变更?如果我更改了一个文件的内容,Docker会只跟踪delta还是将更改后的文件存储在新层中?
我查看了超级用户的讨论,但仍然不确定最终的图像结构。
映像的每一层都是RO,除了顶部的RW容器层和在分层文件系统之外的任何卷挂载。如果您在第一层下载了大量文件,并在第二层(运行在第一层之上的容器)删除它们,第二层包含删除命令,但文件仍然存在于第一层。您可以使用docker diff
:
$ docker run -it --name busytest busybox
/ # echo "hello world" >/root/test.txt
/ # rm /bin/rpm
/ # rm /bin/timeout
/ # rm /bin/wall
/ # exit
$ docker diff busytest
C /bin
D /bin/rpm
D /bin/timeout
D /bin/wall
C /root
A /root/.ash_history
A /root/test.txt
diff为容器RO层的内容。当您构建映像时,每个RUN命令都会从中生成一个层,该层作为最终映像的一部分存储。
如果你在一个图层中有一个文件并修改它(使用RUN
,或COPY
或ADD
),将创建一个新的图层,其中包含新的整个文件,而不是delta。更糟糕的是,如果你只改变文件的权限属性,RUN chmod 400 file
将创建一个新层,并且整个文件内容驻留在这个新层中。
对