长期使用 Docker 部署项目、本地开发构建镜像后,服务器 / 本地磁盘会堆积大量停止的僵尸容器、废弃镜像、无引用数据卷、构建缓存,极易导致磁盘 100% 告警。
很多新手分不清docker rm、docker rmi、docker prune三者区别,误删业务数据、运行中容器。本文结合国内服务器运维场景,从零讲解容器、镜像、数据卷的删除方式,分手动精准删除、批量过滤删除、一键自动清理三类方案,兼顾开发机与生产服务器安全规范。
前置:先查看 Docker 磁盘占用(清理前必执行)
清理前先确认各类资源占用大小,避免盲目操作:

# 查看Docker整体磁盘占用(镜像/容器/卷/缓存)
docker system df
# 详细分层查看每个镜像、容器占用
docker system df -v
# 查看所有容器(含已停止)
docker ps -a
# 查看本地全部镜像
docker images -a
# 查看所有数据卷
docker volume ls
一、Docker 容器删除全操作(docker rm /container prune)
容器分为运行中容器、已停止僵尸容器,删除命令区分强制删除、批量过滤、自动清理。
1. 删除单个 / 多个容器
# 1. 先停止运行容器,再删除(推荐,安全)
docker stop 容器ID/容器名
docker rm 容器ID/容器名
# 2. 强制删除正在运行的容器(无需stop,慎用生产)
docker rm -f 容器ID/容器名
# 3. 一次性删除多个容器(空格分隔ID)
docker rm abc123 def456
2. 批量删除所有已停止容器
# 方式1:prune一键清理所有停止容器(最简)
docker container prune
# 方式2:过滤删除,仅清理24小时前创建的停止容器(生产常用)
docker container prune --filter "until=24h"
# 方式3:命令组合批量删除所有退出容器
docker rm $(docker ps -a -f status=exited -q)
# 方式4:停止并删除服务器全部容器(本地开发机重置用)
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
3. 启动容器自动删除(开发临时容器推荐)
运行时添加--rm,容器退出后自动销毁,不会堆积僵尸容器:
docker run --rm -d nginx
4. 删除容器连带删除匿名数据卷
-v参数可同步删除容器挂载的匿名卷(命名卷不会被删除):
docker rm -v 容器ID
二、Docker 镜像删除全操作(docker rmi /image prune)
镜像分为正常带标签镜像、悬空镜像<none>:<none>,镜像被容器占用时无法直接删除,需强制或先删容器。
1. 删除单个 / 多个镜像
# 删除镜像(无容器依赖时)
docker rmi 镜像ID/镜像名:版本
# 强制删除被容器引用的镜像(谨慎)
docker rmi -f 镜像ID
# 批量删除多个镜像
docker rmi nginx:1.23 mysql:8.0
2. 清理悬空镜像(<none>无标签垃圾镜像)
构建镜像失败、重新打标签会产生悬空镜像,占用大量空间:
# 查看所有悬空镜像
docker images -f dangling=true
# 一键删除全部悬空镜像
docker image prune
3. 批量删除所有未使用镜像
# 删除所有无容器引用的镜像(含带标签废弃镜像)
docker image prune -a
# 强制无确认清理
docker image prune -a -f
4. 按关键词批量删除镜像(如删除所有 java、nginx 镜像)
# 匹配名称过滤删除
docker images | grep nginx | awk '{print $1":"$2}' | xargs docker rmi
5. 删除本地全部镜像(本地开发重置环境)
docker rmi -f $(docker images -a -q)
三、Docker 数据卷删除全操作(docker volume rm /volume prune)
重点提醒:数据卷独立于容器存在,删除容器不会自动删除卷,数据库持久化数据都存在卷内,清理前务必备份!
1. 删除单个 / 多个命名数据卷
# 查看所有卷
docker volume ls
# 删除指定卷
docker volume rm 卷名1 卷名2
2. 清理无容器挂载的悬空卷
无任何容器关联的匿名卷,可安全批量清理:
# 查看悬空卷
docker volume ls -f dangling=true
# 一键删除所有未使用卷
docker volume prune
3. 危险操作:批量清理所有未使用卷(生产慎用)
docker volume prune -a -f
四、一键批量清理所有无用资源(docker system prune)
docker system prune是运维最常用综合清理命令,一条命令清理容器、镜像、网络、缓存,分 3 种安全等级。
1. 基础安全清理(生产环境推荐,默认不删卷)
仅清理:已停止容器、未使用网络、悬空镜像、构建缓存
docker system prune
# 无需确认弹窗,自动执行
docker system prune -f
2. 深度清理(删除全部未使用镜像,不含卷)
增加-a,清理所有无容器引用的镜像(不止悬空镜像)
docker system prune -a
# 静默执行
docker system prune -a -f
3. 彻底全量清理(本地开发机专用,生产严禁直接执行)
--volumes会同步删除所有未挂载数据卷,数据库数据会丢失!
# 警告:会清理停止容器、无用网络、所有未用镜像、未使用数据卷、构建缓存
docker system prune -a --volumes
# 强制无确认
docker system prune -a --volumes -f
4. 带过滤条件清理(仅清理 7 天前闲置资源)
docker system prune -a --filter "until=168h"
五、docker rm /rmi/prune 命令区别对照表
| 命令 | 操作对象 | 核心作用 | 适用场景 |
|---|---|---|---|
| docker rm | 容器 | 删除单个 / 批量指定容器 | 精准清理指定业务容器 |
| docker rmi | 镜像 | 删除单个 / 批量指定镜像 | 手动删除指定废弃镜像 |
| docker volume rm | 数据卷 | 删除指定命名卷 | 手动清理确认无用的持久化数据 |
| docker container prune | 全部停止容器 | 一键清理所有僵尸容器 | 定期运维清理 |
| docker image prune | 无用镜像 | 清理悬空 / 全部未使用镜像 | 释放镜像磁盘 |
| docker volume prune | 悬空数据卷 | 清理无容器挂载卷 | 清理匿名临时数据 |
| docker system prune | 综合资源 | 一键清理容器、镜像、网络、缓存 | 服务器日常空间维护 |
六、生产环境清理避坑指南(运维必看)
- 禁止在业务服务器直接执行
docker system prune -a --volumes--volumes会删除所有未挂载数据库卷,丢失业务持久化数据;生产仅用docker system prune基础清理。 - 清理前先查看运行容器,确认业务无停机
docker ps
- 数据卷清理前备份,MySQL、Redis 卷优先导出备份
- 运行中容器不要
docker rm -f强制删除,会直接中断业务,先docker stop优雅停机 - 构建缓存过大可单独清理:
docker builder prune,不影响镜像与容器 - 磁盘爆满优先清理容器日志,不要直接 rm 日志文件(句柄不释放空间)
七、常见报错与解决方案
报错 1:image is being used by running container
镜像被运行中容器占用,无法 rmi 删除
解决:先停止并删除对应容器,再删镜像;或docker rmi -f强制(不推荐生产)
报错 2:volume is in use
数据卷被容器挂载,无法删除
解决:停止关联容器,确认不再使用后再删除卷
报错 3:磁盘清理后空间不释放
原因:容器日志文件被进程占用、deleted 文件句柄残留
解决:systemctl restart docker重启 Docker 服务释放空间
八、定时自动清理脚本(CentOS/Ubuntu crontab)
适合服务器定时每周自动安全清理,不删除数据卷,避免磁盘爆满:
- 创建清理脚本
docker_clean.sh
#!/bin/bash
# Docker安全清理脚本,仅清理停止容器、悬空镜像、无用网络
echo "=====开始清理Docker无用资源====="
docker system prune -f
echo "=====清理完成,查看磁盘占用====="
docker system df
- 添加执行权限
chmod +x docker_clean.sh
- 设置定时任务(每周日凌晨 2 点自动执行)
crontab -e
# 添加内容
0 2 * * 0 /root/docker_clean.sh >> /var/log/docker_clean.log
九、总结
- 日常运维:使用
docker system prune安全一键清理,无数据丢失风险; - 本地开发重置环境:使用
docker system prune -a --volumes彻底释放空间; - 精准操作:单个容器用
docker rm、单个镜像用docker rmi、单个卷用docker volume rm; - 生产环境严禁随意清理数据卷,持久化数据提前备份;
- 配置定时清理脚本,定期维护磁盘,避免服务器磁盘 100% 告警。