安全清理docker镜像需分步操作:先用docker system df -v识别悬空镜像和未被引用的镜像,再执行docker system prune -f清理无用资源,接着用docker image prune -a -f删除所有未被容器使用的带标签镜像,最后视情况清理构建缓存或卷。
清理 docker 镜像不是“删得越狠越好”,而是先看清哪些能动、哪些不能碰。真正卡住磁盘的,往往不是你正在用的 nginx:alpine,而是几十个带
第一步:看清楚到底谁占了空间
别急着敲命令。先执行:
docker system df
它会列出 Images、Containers、Volumes、Build Cache 四类资源的总量、已用、可回收大小。重点关注 RECLAIMABLE 列——比如显示 “13.2GB (70%)”,说明镜像里有超 13GB 是能安全释放的。
再加个 -v 看细节:
docker system df -v
你会看到每个镜像的创建时间、大小、是否被容器引用。那些 CREATED AT 是几个月前、CONTAINER ID 为空、REPOSITORY 是
第二步:从最安全的方式开始删
日常维护推荐用这个命令,它只动三类东西:已停止的容器、无标签镜像(悬空镜像)、未使用的构建缓存:
docker system prune
它会提示你确认,输入 y 就执行。想跳过提示直接删,加 -f:
docker system prune -f
这个操作不会碰运行中的容器,也不会删你手动打过标签的镜像,更不会动 volumes——属于“闭着眼也能用”的安全起点。
第三步:精准清理镜像本身
如果 docker system df 显示镜像可回收量很大,但 system prune 没怎么瘦,说明很多镜像是“有标签但没被用”。这时要用:
docker image prune -a
它会删掉所有未被任何容器引用的镜像——哪怕你给它打了 latest 标签,只要没容器在跑它,就归入可删范围。
加 -f 强制执行,不弹确认:
docker image prune -a -f
注意:这个命令会删掉你本地所有没在用的镜像,包括你特意 pull 下来备用的基础镜像。如果不确定,先用 docker images --format "{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}" | sort -hr 排个序,把最大的几个手动核对一遍再删。
第四步:处理顽固的中间层和构建残留
有时候删完镜像,df -h 看 /var/lib/docker 还是胖。问题可能出在构建缓存或孤立层上。试试:
docker builder prune -a -f
它清的是构建过程中产生的中间镜像、缓存层、临时文件。CI/CD 机器尤其容易堆积这类东西。
如果连 builder 也清了还不行,最后再考虑:
docker system prune -a -f --volumes
⚠️ 这个命令会删掉所有未被容器使用的卷(volumes)。如果你用 volume 存数据库数据,又没在 docker run 时显式指定 --volumes-from 或 compose 中定义依赖,它可能被误判为“未使用”。务必提前确认:docker volume ls 和 docker volume inspect [name] 查用途。











