最可靠方式是 docker system prune -a,但需确认无误删风险;宝塔“清理”按钮实为 docker system prune -f,仅删停止容器、悬空镜像等,不删闲置正式镜像。

直接清理废弃镜像最可靠的方式是用 docker system prune -a,但必须确认没有误删正在运行或待复用的镜像;宝塔 Docker 管理器的“清理”按钮本质就是调用这个命令的简化封装,不能替代人工判断。
宝塔 Docker 管理器的“清理”按钮到底做了什么
点击面板中 Docker 管理器 → 右上角“清理”按钮,实际执行的是 docker system prune -f(加 -f 跳过确认)。它会删除:
- 所有已停止的容器
- 所有未被任何容器引用的网络
- 所有未被任何容器挂载的卷(⚠️注意:这是高危项,如果手动创建过独立卷且没被容器使用,会被一并清掉)
- 所有悬空镜像(
<none></none>标签的中间层镜像)
但它不会删掉你手动拉取但当前没在运行的镜像(比如 nginx:alpine、mysql:8.0),哪怕这些镜像已闲置半年。所以“点了清理就变干净”是常见误解。
真正要删掉不用的正式镜像,得用 docker system prune -a
这个命令会额外清除所有未被容器使用的镜像(包括带标签的),适合定期手动执行。执行前务必确认:
- 所有需要保留的容器都处于
running状态(或至少没被docker rm过) - 没有通过
docker commit生成但还没打标签的临时镜像要保留 - 你清楚
registry.cn-hangzhou.aliyuncs.com/xxx这类私有镜像是否还有依赖
执行示例:
docker system prune -a -f
加 -f 是跳过交互确认;如想预览将删哪些镜像,先跑 docker system prune -a --dry-run(Docker 20.10+ 支持)。
按条件精准删除镜像,避免误伤
如果只想删某类旧镜像(比如所有 python:3.9 的旧版本),别用 prune,改用 docker images + grep + xargs:
docker images | grep "python:3.9" | awk '{print $3}' | xargs docker rmi
更安全的做法是先查再删:
- 列出所有
python:3.9镜像:docker images python:3.9 - 确认某镜像没被任何容器引用:
docker image inspect <image_id> | grep -q '"Id"' && echo "safe to remove"</image_id> - 强制删除(绕过依赖检查):
docker rmi -f <image_id></image_id>
注意:docker rmi 对悬空镜像(<none></none>)无效,必须用 prune 或 docker image prune。
宝塔里看不到镜像大小?那是界面没刷新或权限问题
宝塔 Docker 管理器的镜像列表默认不显示 SIZE 列,且偶尔缓存旧数据。解决方法:
- 刷新页面后仍无大小:点右上角「重启 Docker」(本质是
systemctl restart docker),再重进面板 - 看到镜像但无法操作:检查宝塔后台是否以 root 运行,以及
/var/run/docker.sock的权限是否为srw-rw---- 1 root docker - 想看真实磁盘占用:直接跑
docker system df -v,它比面板数字更准,尤其能区分镜像、构建缓存、容器层的各自用量
真正难清理的往往不是镜像本身,而是构建过程中产生的 dangling layer 和 build cache——它们不出现在 docker images 里,但占空间,必须靠 docker builder prune 或 docker system prune --filter until=24h 按时间筛选。











