Docker 删除镜像、容器、数据卷完整实操教程(一键清理释放磁盘)

长期使用 Docker 部署项目、本地开发构建镜像后,服务器 / 本地磁盘会堆积大量停止的僵尸容器、废弃镜像、无引用数据卷、构建缓存,极易导致磁盘 100% 告警。

很多新手分不清docker rmdocker rmidocker prune三者区别,误删业务数据、运行中容器。本文结合国内服务器运维场景,从零讲解容器、镜像、数据卷的删除方式,分手动精准删除批量过滤删除一键自动清理三类方案,兼顾开发机与生产服务器安全规范。

前置:先查看 Docker 磁盘占用(清理前必执行)

清理前先确认各类资源占用大小,避免盲目操作:

docker system df查看使用空间
# 查看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综合资源一键清理容器、镜像、网络、缓存服务器日常空间维护

六、生产环境清理避坑指南(运维必看)

  1. 禁止在业务服务器直接执行 docker system prune -a --volumes --volumes会删除所有未挂载数据库卷,丢失业务持久化数据;生产仅用docker system prune基础清理。
  2. 清理前先查看运行容器,确认业务无停机
docker ps
  1. 数据卷清理前备份,MySQL、Redis 卷优先导出备份
  2. 运行中容器不要docker rm -f强制删除,会直接中断业务,先docker stop优雅停机
  3. 构建缓存过大可单独清理:docker builder prune,不影响镜像与容器
  4. 磁盘爆满优先清理容器日志,不要直接 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)

适合服务器定时每周自动安全清理,不删除数据卷,避免磁盘爆满:

  1. 创建清理脚本 docker_clean.sh
#!/bin/bash
# Docker安全清理脚本,仅清理停止容器、悬空镜像、无用网络
echo "=====开始清理Docker无用资源====="
docker system prune -f
echo "=====清理完成,查看磁盘占用====="
docker system df
  1. 添加执行权限
chmod +x docker_clean.sh
  1. 设置定时任务(每周日凌晨 2 点自动执行)
crontab -e
# 添加内容
0 2 * * 0 /root/docker_clean.sh >> /var/log/docker_clean.log

九、总结

  1. 日常运维:使用docker system prune安全一键清理,无数据丢失风险;
  2. 本地开发重置环境:使用docker system prune -a --volumes彻底释放空间;
  3. 精准操作:单个容器用docker rm、单个镜像用docker rmi、单个卷用docker volume rm
  4. 生产环境严禁随意清理数据卷,持久化数据提前备份;
  5. 配置定时清理脚本,定期维护磁盘,避免服务器磁盘 100% 告警。
本文首发于 58Linux技术博客,专注Ubuntu桌面使用、Linux服务器运维与网站搭建实战。

发表评论

粤ICP备10052831号 | © 2026 58Linux 技术笔记. All Rights Reserved. | 联系我们 | 关于本站
本站内容开放共享,仅供学习交流 | 专注 Ubuntu & Linux 实战教程
Built with GeneratePress