背景:
Docker的镜像由层组成,层又由文件组成。当前Docker Hub中已存储超千万个镜像,并使用层共享方式来减少冗余(即层级重复数据删除),但是由于Docker镜像开发规范的不完善,再加上开发人员常常自己创建docker镜像层而不是直接使用已经存在的层等原因,导致Docker中存在大量的几乎相同又不完全相同的层,在层级重复数据删除的背景下这些层都会被识别为unique层进行存储,因此产生了大量的冗余。
所以本文章提出了对docker数据中心中的所有镜像进行重组,即将所有的层打散为文件,再将这些文件重组为新的层,以减少冗余,降低存储开销。
方法:
考虑操作开销(镜像中层的数量)、存储开销(镜像大小)、网络开销(镜像中无用文件的大小)三个维度:
优点:消除了存储冗余,降低了网络成本
缺点:增加了性能开销(操作成本)
b.每一个镜像只有一个层,即一个镜像的所有文件都放在一个layer里面——
优点:操作成本降低
缺点:存储开销大,网络成本高(没有层共享了)
c.整个数据中心中所有镜像的文件全部存储为一个layer——
优点:没有文件冗余,操作成本极低
缺点:网络开销极高
如上图所示,在对镜像的一个文件进行划分时,有以下五种情况
-
划分到已创建的层中,层中已存在该文件,层没有被该镜像使用
-
划分到已创建的层中,层中不存在该文件,层已经被该镜像使用
-
划分到已创建的层中,层中已存在该文件,层已经被该镜像使用
-
划分到已创建的层中,层中不存在该文件,层没有被该镜像使用
-
划分到新创建的空层中,层中不存在该文件,层没有被该镜像使用
Addition:把文件(层)划入层(镜像)中
Oper.:操作开销增加量,每多一个层+1
Storage:存储开销增加量,每多一个文件+1(真正的开销增加量应该是文件大小)
Network:网络开销增加量,即镜像的整个文件集减去镜像真正需要的文件集
实验评估:
在对三个维度分配不同的权重下可以看到数据中心的开销都有很好地优化