2.1.3 容器存储

1.镜像元数据

在Linux系统中Docker的数据默认存放在/var/lib/docker中,基于不同的系统又有不同的存储驱动和不同的目录结构。我们以OCI标准格式来了解镜像存储的内容,如图2-2所示。

图2-2 镜像存储目录

镜像每一层的ID是该文件内容的散列校验值,作为该层的唯一标识。获取镜像后,会使用以下方式索引镜像:首先读取镜像的manifests文件,根据manifests文件中config的sha256码,得到镜像config文件,遍历manifests文件里面的所有层(layer),根据其sha256码在本地查找,拼出完整的镜像。

2.存储驱动

在理想情况下,我们使用挂载卷来存储高读写的目录,很少将数据直接写入容器的可写层。但是,总有一些需要直接写入容器可写层的特殊需求,这时候就需要存储驱动来作为容器和宿主机之间的媒介。Docker依靠驱动技术来管理镜像与运行它们的容器间的存储和交互。

目前,Docker支持overlay2、aufs、fuse-overlayfs、devicemapper、btrfs、zfs、vfs等存储驱动[5]。没有单一的存储驱动可适合所有的应用场景,要根据不同的场景选择合适的存储驱动,这样才能有效提高Docker的性能。

3.数据卷

通常,有状态的容器都有数据持久化存储的需求。前一节提到过,文件系统的改动都是发生在最上面的可读写层。在容器的生命周期内它是持续的,包括容器被停止后。但是,当容器被删除后,该数据层也随之被删除了。

因此,Docker采用数据卷(Volume)的形式向容器提供持久化存储。数据卷是Docker容器数据持久化存储的首选机制。绑定挂载(Bind Mounts)依赖于主机的目录结构,但数据卷是由Docker管理的。