Docker占用的巨大磁盘空间的清理方法

 更新时间:2025年09月29日 08:51:13   作者:孽小倩  
我相信很多人在使用 Docker 一段时间后,都会遇到一个常见问题:磁盘空间被迅速吃光,尤其是在进行频繁的镜像构建、测试和运行容器时,这种情况并不少见,本文会介绍 Docker 为什么会占用这么多空间,以及如何一步步地清理,需要的朋友可以参考下

我相信很多人在使用 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 特别大,就说明问题出在构建缓存。

六、后续优化建议

  1. 定期清理
    可以加一个定时任务,每个月执行一次 docker builder prune --alldocker volume prune
  2. 精简 Dockerfile
    减少无意义的构建层,比如把多个 RUN 合并,减少缓存堆积。
  3. 单独挂载 /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 一键清理

清理完成之后,占用空间明显减少:

以上就是Docker占用的巨大磁盘空间的清理方法的详细内容,更多关于Docker占用磁盘空间清理的资料请关注脚本之家其它相关文章!

相关文章

  • Docker自定义JDK镜像并拉取至阿里云镜像仓库超详细攻略

    Docker自定义JDK镜像并拉取至阿里云镜像仓库超详细攻略

    Docker仓库是集中存放镜像的地方,分为公共仓库和私有仓库,这篇文章主要给大家介绍了关于Docker自定义JDK镜像并拉取至阿里云镜像仓库的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Docker无法stop或者rm指定容器问题解决方案

    Docker无法stop或者rm指定容器问题解决方案

    这篇文章主要介绍了Docker无法stop或者rm指定容器问题解决方案,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • nerdctl替代docker及docker-compose的安装使用

    nerdctl替代docker及docker-compose的安装使用

    这篇文章主要为大家介绍了nerdctl替代docker及docker-compose的安装使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 详解MAC OSX Docker开发环境搭建

    详解MAC OSX Docker开发环境搭建

    本篇文章主要介绍了详解MAC OSX Docker开发环境搭建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Docker Registry搭建与使用详解

    Docker Registry搭建与使用详解

    这篇文章主要介绍了Docker Registry搭建与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • docker利用dockerfile构建镜像

    docker利用dockerfile构建镜像

    dockerfile是一种用于定义和构建docker镜像的文本文件,由一行行指令和参数组成,用于描述镜像的构建和配置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成
    2024-10-10
  • Docker容器化spring boot应用详解

    Docker容器化spring boot应用详解

    本篇文章主要介绍了Docker容器化spring boot应用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • docker配置skywalking 监控springcloud应用的详细步骤

    docker配置skywalking 监控springcloud应用的详细步骤

    本文分步骤给大家讲解docker配置skywalking 监控springcloud应用的方法,感兴趣的朋友一起看看吧
    2025-04-04
  • Docker下多容器搭建 lamp的详细过程(httpd+mysql+php+redis)

    Docker下多容器搭建 lamp的详细过程(httpd+mysql+php+redis)

    这篇文章主要介绍了Docker下多容器搭建lamp的详细过程(httpd+mysql+php+redis),搭建拉取所需镜像,本文给大家讲解的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • docker查询日志并输出到文件的方法

    docker查询日志并输出到文件的方法

    docker的运行的时候我们喜欢采用 -d 的命令来启动docker容器,这就导致了一个问题,无法直接看到docker运行日志,只能去后台进去找到日志文件查看,下面这篇文章主要给大家介绍了关于docker查询日志并输出到文件的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论