考虑Docker的联合文件系统,实际上将对当前图像(最顶层)而不是之前的图像进行任何更改;问题是为什么这些图层不会被Docker破坏而只是隐藏?有什么特别的理由吗?
答案 0 :(得分:2)
缓存
通过单独保存每个图层,如果以前的任何更改都没有使结果生效,则docker可以缓存结果并在以后重新使用它。
当从同一基本图像构建多个图像时,可实现更快的构建和更小的整体文件系统使用
答案 1 :(得分:1)
Docker建立在AUFS上,这是一个联合文件系统。
通过AUFS将更改叠加在一起来创建图像(从那时起已添加其他方法)
典型的构建将RUN
创建一些数据并保存在图层中。
RUN touch a -- L1 a
RUN touch b -- L2 b
RUN touch c -- L3 c
每个图层仅存储自己的一组更改。
这些AUFS层的总和一个安装在每个层之上,以成为容器的底层虚拟文件系统。 “图像”只是底层图层中数据的视图。
图像本身不存储任何数据。它仅引用存储数据的图层。
*image view a b c
L3 c
L2 b
L1 a
然后在所有这些之上的层中进行容器更改。如果需要修改,则从适当的层复制任何现有数据,将新数据添加到其层中,或“删除”删除数据引用的数据,而不删除底层中的实际数据。
如果我要修改文件,请创建文件,然后删除文件
echo test >> a
touch d
rm c
图层看起来像:
Lcontainer a * d
L3 c
L2 b
L1 a
如果您要销毁其中一个较低层,则呈现给容器的视图将缺少该数据。
*image view a c
L3 c
L1 a
作为Derick Bailey mentions,这允许一些聪明的图像构建时缓存,允许在图像之间共享图层,如果再次使用完全相同的图层。这通常是在您构建FROM
现有图像时。
decivemapper
和zfs
等较新的存储驱动程序实现相同的策略,但在块级别使用文件系统快照或每个层的克隆执行此操作。与底层/快照保持不变的磁盘块将从原始层/快照读取。容器层/快照维护指针返回原始数据,直到更改或删除为止。