文章

Docker概念相关

存储结构

overlay2文件存储

是 Docker 默认使用的存储驱动之一,属于联合文件系统(UnionFS)的一种实现。它通过分层叠加的方式管理容器镜像和容器运行时数据

一、镜像分层数据(Image Layers)

overlay2 将 Docker 镜像拆分为多个只读层,每层对应镜像构建过程中的一个操作(如 RUN、COPY 等指令)。这些分层数据存储在:

1
/var/lib/docker/overlay2/<layer_id>/diff/

每个分层的作用

底层(base layer):通常是基础镜像(如 ubuntu:latest)。

上层(delta layers):每次镜像构建的增量修改(如安装软件、复制文件等)。

分层优势

共享公共层:多个镜像可复用相同底层,节省磁盘空间。

增量更新:仅存储修改部分,加速镜像拉取和构建。

二、容器运行时数据(Container Runtime)

当容器运行时,overlay2 会创建可写层和元数据:

可写层(Writable Layer) 存储容器运行时的修改(如新增文件、修改配置),路径为: plaintext /var/lib/docker/overlay2//diff/

容器对文件的修改不会直接影响底层镜像,而是写入此层。 容器删除后,可写层数据默认会被清除。 元数据目录(Metadata) 包含容器的状态信息,如: plaintext /var/lib/docker/overlay2//merged/ # 合并后的文件系统视图 /var/lib/docker/overlay2//work/ # 临时工作目录

merged/ 目录将只读镜像层与可写层合并,形成容器看到的完整文件系统。 work/ 用于存储联合文件系统操作的临时数据。

三、镜像元数据与缓存

overlay2 还会存储镜像和容器的元数据及缓存:

镜像元数据 记录镜像分层的映射关系,位于: plaintext /var/lib/docker/overlay2/repositories.json

包含镜像标签、分层 ID、依赖关系等信息。 分层缓存(Layer Cache) 加速镜像拉取和构建的临时文件,如: plaintext /var/lib/docker/overlay2/layers/

四、核心目录结构解析

overlay2 的典型目录结构如下:

1
2
3
4
5
6
7
8
9
10
/var/lib/docker/overlay2/
├── <hash1>/            # 镜像层或容器的根目录
│   ├── diff/           # 分层文件内容(镜像层为只读,容器层为可写)
│   ├── link            # 指向父层的链接
│   ├── merged/         # 合并后的文件系统(仅容器存在)
│   └── work/           # 临时工作目录(仅容器存在)
├── <hash2>/            # 另一镜像层或容器
├── layers/             # 镜像层缓存
├── repositories.json   # 镜像元数据
└── overlay2.imx        # 内部元数据文件(如 inode 映射)

hash 通常由镜像层的校验和(如 sha256)生成。

容器的 hash 为容器 ID 的前 12 位字符。

五、联合文件系统的工作机制

overlay2 采用 写时复制(Copy-on-Write, CoW) 和 重定向(Redirect) 机制:

读操作:直接从底层镜像层读取文件。 写操作: 若修改已有文件,先将文件复制到容器的可写层,再修改(CoW)。 若新增文件,直接写入可写层。 删除操作:在可写层创建 .wh.<filename> 隐藏文件标记删除(Whiteout),而非真正删除底层文件。

六、空间管理与优化

磁盘占用分析 可通过以下命令查看 overlay2 存储使用情况:

1
2
docker system df  # 查看镜像、容器、缓存的空间占用
du -sh /var/lib/docker/overlay2  # 查看总占用

空间释放 清理无用镜像:docker image prune 清理停止的容器:docker container prune 清理构建缓存:docker builder prune 性能优化 调整 overlay2 配置(如 –storage-opt overlay2.override_kernel_check=true 绕过内核版本检查)。 使用 SSD 存储加速 IO 操作。

本文由作者按照 CC BY 4.0 进行授权