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

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

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

这取决于您的存储驱动程序 :

码头层

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

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

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

现在,在运行时:

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

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

默认的驱动程序是aufsoverlayoverlay2驱动程序。
但是Btrfs,ZFS和其他驱动程序不同地处理写入时拷贝。

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

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

如果Docker在每次启动一个新的容器时都必须制作一个底层映像堆栈的整个副本,那么容器的启动时间和磁盘空间将大大增加。

请参阅“ select存储驱动程序 ”。