在Docker中,图像是一堆只读图像层。我们也知道图像共享图层或其他图像。我的问题是关于这种共享机制如何运作。
图像是否有指向Docker存储驱动程序的指针,或者它们实际上是否包含其他图层?如果第一个是真的,这是否意味着Dockerfile将这些层保存到守护进程中,图像是按顺序检索这些层的指令?
答案 0 :(得分:0)
这取决于您的storage driver:
Docker使用存储驱动程序来管理图像图层和可写容器图层的内容 每个存储驱动程序以不同方式处理实现,但所有驱动程序都使用可堆叠图像层和写时复制(CoW)策略。
写时复制是一种共享和复制文件的策略,可实现最高效率。
- 如果文件或目录存在于图像中的较低层,而另一层(包括可写层)需要对其进行读访问,则它只使用现有文件。
- 第一次另一个图层需要修改文件时(构建图像或运行容器时),文件将被复制到该图层并进行修改。这最小化了I / O和每个后续层的大小。
现在,在运行时:
启动容器时,会在其他图层的顶部添加薄的可写容器图层。容器对文件系统所做的任何更改都存储在此处。容器未更改的任何文件都不会复制到此可写层。这意味着可写层尽可能小。
当修改容器中的现有文件时,存储驱动程序会执行写时复制操作。涉及的具体步骤取决于特定的存储驱动程序。
默认驱动程序为aufs
,以及overlay
和overlay2
驱动程序
但是Btrfs,ZFS和其他驱动程序以不同的方式处理写时复制。
但无论如何,CoW仍然是关键:
写入时复制不仅可以节省空间,还可以缩短启动时间。当您启动容器(或来自同一图像的多个容器)时,Docker只需要创建可写的容器图层。
如果Docker每次启动新容器时都必须制作底层映像堆栈的完整副本,则容器启动时间和使用的磁盘空间将显着增加。
请参阅" Select a storage driver"。