/var/lib/docker/overlay2/是 Docker 使用 Overlay2 存储驱动时的核心目录,理解了它,就能更好地管理 Docker 的磁盘空间和容器文件系统。下面这个表格汇总了它的关键组成部分和作用。
目录
1. /var/lib/docker/overlay2/目录结构
1. /var/lib/docker/overlay2/目录结构
| 组件名称 | 类型 | 作用描述 |
|---|---|---|
| 镜像/容器层目录 ( | 目录 | 存储每个镜像层或容器可写层的实际内容,目录名由哈希值唯一标识。 |
|
| 子目录 | 存放该层相对于其父层所有新增或修改的文件。对于容器,所有写入操作都保存在其可写层的 |
|
| 子目录 | OverlayFS 将下层( |
|
| 子目录 | OverlayFS 内部使用的工作目录,用于确保文件操作(如拷贝)的原子性,切勿手动修改。 |
|
| 目录 | 包含许多软链接,指向各层的 |
|
| 文件 | 存在于各层目录中,是一个文本文件,内容记录了该层所依赖的所有下层镜像的ID,明确了层的继承关系。 |
|
| 文件 | 存在于各层目录中,包含一个较短的随机字符串,与 |
2. 工作原理与关键概念
了解目录结构后,我们来看看 Overlay2 是如何运作的。
-
分层与联合挂载:Overlay2 是一种联合文件系统。它将一个可读写层(upperdir,即容器的
diff目录) 和一个或多个只读层(lowerdir,即镜像层) 合并起来,通过merged目录提供一个统一的视图。容器看到的是所有层文件叠加后的结果。 -
写时复制(Copy-on-Write):当你启动一个容器后,所有对容器文件系统的修改都只发生在容器的可写层(upperdir)。如果你要修改一个存在于下层只读镜像层中的文件,Overlay2 会先将这个文件复制到容器的可写层,然后再进行修改。这就是“写时复制”机制,它保证了镜像层的不可变性,使得多个容器可以安全地共享同一个基础镜像。
3. 日常管理与排查
掌握这些知识能帮助你解决实际问题。
3.1 查看目录占用空间
当磁盘空间告急时,你可以使用以下命令找出 overlay2下占用空间最大的目录:
sudo du -h -d 1 /var/lib/docker/overlay2 | sort -rh | head -n 10

3.2 关联目录与容器
找到大目录后,可以用这个命令反查它属于哪个容器(将 你的目录名替换为实际目录名):
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "你的目录名"


3.3 安全清理空间
切勿直接手动删除 overlay2目录下的子目录或文件,这会导致数据不一致甚至容器崩溃。正确的清理方式是使用 Docker 自带的命令:
# 清理所有未使用的镜像、容器、网络和构建缓存
docker system prune -a
# 仅清理悬空(未被任何镜像引用)的镜像层
docker image prune
3.4 理解"孤儿层"(Orphaned Layers)
有时你可能会发现一些较大的目录无法通过 docker inspect关联到任何正在运行的容器。这些可能是“孤儿层”,通常由容器未正确清理、Docker 进程异常退出等原因留下。在确认这些层确实无用后,上述 docker system prune命令通常可以安全地清理它们。
K8S中Docker磁盘占用清理
3324

被折叠的 条评论
为什么被折叠?



