如何批量清理旧的(已停止的)Docker 容器?
docker container prune 一键清理所有停止的容器;docker system prune 连未用镜像网络一起清;按条件清理用 docker rm $(docker ps -aq --filter ...)。本文给出安全清理策略。
一键做法:docker container prune——清掉所有处于停止状态的容器(会提示确认)。更彻底用 docker system prune:停止的容器、悬空镜像、未用网络一起清。想精细控制用 docker ps -aq --filter 筛选后批量 rm。
常用清理命令
# 清所有停止的容器
docker container prune # 会问 y/N,加 -f 跳过确认
# 全家桶:容器+悬空镜像+未用网络
docker system prune
# 再狠一点:连未被引用的镜像和卷也清
docker system prune -a --volumes # ⚠️ 卷数据会删,慎用
按条件精准清理
# 退出超过 24 小时的容器
docker ps -aq --filter "status=exited" --filter "until=24h"
# 清掉它们
docker rm $(docker ps -aq --filter "status=exited" --filter "until=24h")
# 按名字模式清(如 CI 残留)
docker rm $(docker ps -aq --filter "name=ci-job-")
清理前检查
- 停止 ≠ 无用:有些是故意停下来留档的,确认再删
- 可写层数据:
docker diff 容器名看有无未持久化的改动,重要先docker cp拷出 - 卷默认保留:rm 不带 -v 时命名卷不动;匿名卷想连带删用
docker rm -v
自动化:定期清理
# 每周日凌晨清一次停止的容器与悬空镜像
0 3 * * 0 /usr/bin/docker system prune -f
CI 构建机、开发机尤其需要——容器残留是磁盘缓慢失血的主因。
观测云对照
残留堆积在趋势里可见。 主机上容器数量、磁盘用量由 DataKit 持续采集,容器只增不减的趋势线、磁盘水位上涨都能触发监控器告警,清理从救火变例行。
常见问题(FAQ)
Q:prune 会影响正在运行的容器吗?
A:不会,只动停止状态的。
Q:清完磁盘空间没怎么变?
A:大头可能在镜像或容器日志:docker system df 看去向,镜像用 docker image prune -a,日志见本系列磁盘清理篇。
Q:删错了能恢复吗?
A:容器删了就没了(可写层随之消失);卷没被 -v 连删的话数据还在,重建容器挂回即可。