我相信很多人在使用 Docker 一段时间后,都会遇到一个常见问题:磁盘空间被迅速吃光,尤其是在进行频繁的镜像构建、测试和运行容器时。以我自己为例,在 Ubuntu 24.04设备上,docker system df -v
一看,Docker 已经占用了 700G+,如下图。其中光是 build cache 就达到了 552G。这种情况并不少见。本文会介绍 Docker 为什么会占用这么多空间,以及如何一步步地清理。

一、为什么 Docker 会占用这么多空间
Docker 的设计原理决定了它会不断产生缓存和中间数据。主要来源有以下几类:
镜像层
每次docker build
都会把Dockerfile
的指令拆分成一层一层的镜像。如果你频繁修改 Dockerfile 或者构建不同版本的镜像,就会产生很多旧层。构建缓存(Build Cache)
Docker 默认会缓存中间步骤,以加快下一次构建。例如第一次apt-get update
的结果会被缓存,第二次构建就直接复用。但随着时间推移,这些缓存越来越多,磁盘就被“吃掉”。容器
容器删除不及时会保留磁盘空间,尤其是已停止的容器。卷(Volumes)
数据卷用于持久化数据库、日志等内容。如果你经常测试数据库镜像(比如 MySQL、Postgres),卷很容易膨胀到几十个 G。网络
Docker 会为容器分配网络,虽然占用空间不大,但如果创建过多也会留下无用配置。
二、先看看空间到底去哪了
第一步是确认哪些部分占用最大。
docker system df -v
它的结构是这样的:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 120 5 80.5GB 70GB (87%)
Containers 15 2 5.3GB 4GB (75%)
Local Volumes 30 10 62GB 40GB (64%)
Build Cache 300 552.7GB 552.7GB
但实际上我们每个项可能都非常多,比如我的光Image这项就一页看不到头。
可以看到项目非常多,我们大致往下划一下,看到,build cache 是最大的“罪魁祸首”。
当然每个人情况可能不一样,但是cache通常都是罪魁祸首,找打了原因,如何清理呢?
三、如何清理
1. 清理构建缓存
构建缓存往往占用空间最多。
# 删除未使用的构建缓存
docker builder prune# 更彻底,删除所有缓存,包括可能还会用到的
docker builder prune --all
举个例子:如果你构建了 100 个不同版本的镜像,每次 Dockerfile 都有 apt-get update
,这些中间结果会一直留在缓存里。执行 docker builder prune --all
后,这些缓存会被清理掉,立刻释放出上百 G。缺点是下次构建会变慢,因为缓存没了。
2. 清理没用的容器
已停止的容器(状态 Exited
)通常没有意义,可以直接删掉。
docker container prune
如果你想更谨慎,可以先查看:
docker ps -a
例如:
CONTAINER ID IMAGE STATUS
abcd1234 ubuntu Exited (0) 2 weeks ago
efgh5678 nginx Exited (137) 3 days ago
这些容器通常就是“残骸”。
3. 清理悬空镜像
所谓悬空镜像,是指 tag 为 <none>
的镜像,它们是被新镜像替换后的旧版本。
查看:
docker images -f dangling=true
清理:
docker image prune
例如你频繁用 docker build .
,每次都会产生一个新镜像,旧的就变成 <none>
。
4. 清理没用的卷
卷是最容易“暗中膨胀”的地方,特别是数据库。
查看:
docker volume ls -f dangling=true
清理:
docker volume prune
比如你测试过几次 MySQL,每次都挂载了一个 volume,哪怕容器删了,数据卷也可能还在,几十 G 的数据就这么堆积下来。
5. 清理没用的网络
查看:
docker network ls
清理:
docker network prune
虽然网络占用空间不大,但保持干净是好习惯。
四、一键清理
如果你只是做实验,对数据不敏感,可以直接:
docker system prune -a --volumes
这会删除所有:
已停止的容器
没有 tag 的镜像
没用的卷
没用的网络
构建缓存
空间释放得最快,但要注意数据卷和缓存一旦清理,就无法恢复。
五、更深入的检查
有时候你清理完,空间还是很大,可以直接查看 /var/lib/docker
下哪些目录占用:
sudo du -h --max-depth=1 /var/lib/docker | sort -h
常见大户:
overlay2/
:镜像和容器的文件系统volumes/
:卷的数据buildkit/
:构建缓存
如果 buildkit 特别大,就说明问题出在构建缓存。
六、后续优化建议
定期清理
可以加一个定时任务,每个月执行一次docker builder prune --all
和docker volume prune
。精简 Dockerfile
减少无意义的构建层,比如把多个RUN
合并,减少缓存堆积。单独挂载
/var/lib/docker
如果 Docker 用得多,可以把/var/lib/docker
放到一个大磁盘分区,避免根分区被塞满。
七、总结
Docker 占用空间大的原因,往往是 build cache、卷和镜像残留。清理的核心命令就是:
docker builder prune --all
清理构建缓存docker container prune
清理没用的容器docker image prune
清理悬空镜像docker volume prune
清理没用的卷docker network prune
清理没用的网络docker system prune -a --volumes
一键清理
清理完成之后,占用空间明显减少: