根据联合文件系统,图像实际上是容器的另一个图像吗?

时间:2017-12-22 20:14:12

标签: docker device-mapper ufs

在Docker中,图像是一堆只读图像层。我们也知道图像共享图层或其他图像。我的问题是关于这种共享机制如何运作。

图像是否有指向Docker存储驱动程序的指针,或者它们实际上是否包含其他图层?如果第一个是真的,这是否意味着Dockerfile将这些层保存到守护进程中,图像是按顺序检索这些层的指令?

1 个答案:

答案 0 :(得分:0)

这取决于您的storage driver

docker layers

  

Docker使用存储驱动程序来管理图像图层和可写容器图层的内容   每个存储驱动程序以不同方式处理实现,但所有驱动程序都使用可堆叠图像层和写时复制(CoW)策略。

     

写时复制是一种共享和复制文件的策略,可实现最高效率。

     
      
  • 如果文件或目录存在于图像中的较低层,而另一层(包括可写层)需要对其进行读访问,则它只使用现有文件。
  •   
  • 第一次另一个图层需要修改文件时(构建图像或运行容器时),文件将被复制到该图层并进行修改。这最小化了I / O和每个后续层的大小。
  •   

现在,在运行时:

  

启动容器时,会在其他图层的顶部添加薄的可写容器图层。容器对文件系统所做的任何更改都存储在此处。容器未更改的任何文件都不会复制到此可写层。这意味着可写层尽可能小。

     

当修改容器中的现有文件时,存储驱动程序会执行写时复制操作。涉及的具体步骤取决于特定的存储驱动程序。

默认驱动程序为aufs,以及overlayoverlay2驱动程序 但是Btrfs,ZFS和其他驱动程序以不同的方式处理写时复制。

但无论如何,CoW仍然是关键:

  

写入时复制不仅可以节省空间,还可以缩短启动时间。当您启动容器(或来自同一图像的多个容器)时,Docker只需要创建可写的容器图层。

     

如果Docker每次启动新容器时都必须制作底层映像堆栈的完整副本,则容器启动时间和使用的磁盘空间将显着增加。

请参阅" Select a storage driver"。