Docker overlay存储驱动是如何工作的?
原文链接
该内容仅仅适用于overlay存储驱动。Docker官方建议适用overlay2 驱动,overlay2工作方式不同于overlay。overlay2工作原理链接
【https://docs.docker.com/storage/storagedriver/overlayfs-driver/#how-the-overlay2-driver-works】
OverlayFS在Linux主机上有两个目录但呈现给用户就像只有一个目录一样。这些目录称之为层(layers),这些层的统一呈现通过联合挂载实现。OverlayFS将底层目录视作lowerdir,将上层目录称作upperdir,通过叫做merged目录对外暴露统一的视图。
以下图片展示了Docker的镜像和Docker容器的分层结构。 镜像层就是lowerdir目录,而uppperdir目录就是容器层。统一对外暴露的视图就是merged目录,该目录也是容器的挂载点。Docker结构映射OverlayFS结构图如下:
当镜像层和容器层有相同的文件的时候,容器层的文件会掩盖了镜像层的文件。overlay驱动仅仅适用两层模型工作。
This means that multi-layered images cannot be implemented as multiple OverlayFS layers.
这意味着多层的镜像无法用多层的OverlayFS实现。相反,每个镜像层使用位于/var/lib/docker/overlay下的一层目录实现。出于空间效率的考虑,使用硬链接的方式来共享lower层。从Docker1.10开始,镜像层的ID不在和/var/lib/docker下的目录名称一一对应。
当创建容器的时候,overlay驱动会联合代表了镜像层的目录以及新创建的容器目录结构。
镜像的顶层就是lowerdir并且是只读的,而新创建的容器目录称作upperdir并且是可写的。