如何删除 Docker 镜像?
删单个镜像用 docker rmi 镜像名:标签,批量删可列多个参数;全量清理前先核对容器与标签引用,并处理空列表。-f 不能绕过所有冲突;悬空镜像用 docker image prune。
基本命令:docker rmi <镜像名:标签或ID> 删指定镜像;多个一起删就列多个参数;全部删除前必须先检查引用和数据,使用下方带空列表保护的步骤。删不掉的两种原因:有容器在用(检查容器后再处理;-f 不能绕过所有冲突)、有多个标签(每个标签删一次或按 ID 强删)。
先看有什么
docker images -a
按名/按 ID 删
docker rmi nginx:1.25 # 按 名称:标签
docker rmi d583c3ac45fd # 按镜像 ID
docker rmi img1:tag img2:tag d583 # 批量
注意:按名删只是删标签;镜像有多个标签时数据还在,直到最后一个标签被删。
删不掉的处理
被容器引用(哪怕容器已停止):
Error response from daemon: conflict: unable to remove repository reference ... container is using it
docker ps -a --filter ancestor=nginx:1.25 # 先检查,可能还包含派生镜像的容器
# 确认归属/数据后,按明确的容器 ID 执行 docker rm
docker rmi nginx:1.25
# 或强行
docker rmi -f nginx:1.25
清空全部镜像
# Bash;确认当前daemon和全部工作负载可删除后执行,不删除卷
set -euo pipefail
ids=$(docker ps -aq)
[ -z "$ids" ] || printf '%s\n' "$ids" | xargs docker rm -f
ids=$(docker images -aq | sort -u)
[ -z "$ids" ] || printf '%s\n' "$ids" | xargs docker rmi
若镜像有多个标签,按 ID 删除仍可能报冲突;先逐个删除相应标签,或确认后使用 docker rmi -f <ID>。
日常回收可用,但并非全量清空的等价物:docker system prune -a(未使用的镜像+停止容器+网络+缓存一锅端)。
只清悬空镜像
重新构建后留下一堆 <none>:<none>:
docker image prune # 只清悬空镜像,不动有标签的
常见问题(FAQ)
Q:rmi 之后磁盘空间没释放?
A:镜像层被其他镜像共享,删一个标签可能只释放少量独有层;docker system df 看真实可回收量。
Q:仓库里的镜像怎么删?
A:rmi 只删本地。远端仓库要在仓库侧操作(Harbor 控制台/Registry API),再考虑垃圾回收。
Q:能不能保留最近 N 个版本自动清理?
A:Docker 本身没有,写脚本按时间排序过滤;CI 场景建议配合仓库侧保留策略。