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/
容器对文件的修改不会直接影响底层镜像,而是写入此层。
容器删除后,可写层数据默认会被清除。
元数据目录(Metadata)
包含容器的状态信息,如:
plaintext
/var/lib/docker/overlay2/
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 操作。