为什么Docker不会破坏隐藏的图层?

时间:2017-04-11 02:48:52

标签: docker

考虑Docker的联合文件系统,实际上将对当前图像(最顶层)而不是之前的图像进行任何更改;问题是为什么这些图层不会被Docker破坏而只是隐藏?有什么特别的理由吗?

2 个答案:

答案 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现有图像时。

decivemapperzfs等较新的存储驱动程序实现相同的策略,但在块级别使用文件系统快照或每个层的克隆执行此操作。与底层/快照保持不变的磁盘块将从原始层/快照读取。容器层/快照维护指针返回原始数据,直到更改或删除为止。