Docker镜像清理

🗓️ 2025-08-19 📁 tech 📝 1859 字 ⏱️ 约 4 分钟 👁️ 访问量: -

总结

命令 功能 安全性
docker image prune 清理悬空镜像 非常安全
docker image prune -a 清理所有未被容器使用的镜像 比较安全(但可能删除你想保留的)
docker system prune 全面清理(容器、网络、悬空镜像) 比较安全
docker system prune -a 更彻底的全面清理(包括未使用的镜像) 小心使用
docker rmi <image> 手动删除指定镜像 安全(有保护机制)
docker system prune --volumes 清理所有,包括数据卷 高风险!

建议的清理流程:

  1. 定期运行 docker image prune 来做日常维护。
  2. 当磁盘空间紧张时,运行 docker system prunedocker image prune -a 进行一次更彻底的清理。
  3. 对于不再需要的特定项目镜像,手动使用 docker rmi 删除。

懒人包(推荐的快速方法)

对于大多数日常清理,下面这几个命令就足够了。

1. 清理悬空镜像(Dangling Images)

悬空镜像是那些没有标签(tag 显示为 <none>),并且没有任何容器在使用的镜像。它们通常是在你重新构建一个已存在的镜像时产生的。

这是最安全、最常用的清理命令:

docker image prune

执行后,它会提示你确认是否要删除这些悬空镜像,并显示可以释放多少空间。输入 y 即可。

W A A r R e N I y N o G u ! s T u h r i e s y w o i u l l w a r n e t m o t v o e c a o l n l t i d n a u n e g ? l i [ n y g / N i ] m a y g e s .

如果你不想看到确认提示,可以直接加上 -f--force 参数:

docker image prune -f

2. 清理所有未被使用的镜像

这个命令会更进一步,它不仅会删除悬空镜像,还会删除所有没有被任何容器(包括已停止的容器)使用的镜像。

⚠️ 警告: 这个命令会删除你可能还想保留的镜像,比如一些基础镜像或旧版本的应用镜像。请谨慎使用。

docker image prune -a
# 或者
docker image prune --all

同样,它会请求确认。加上 -f 可以跳过确认。


系统级全面清理

如果你想一次性清理掉所有不再需要的东西(包括容器、网络等),可以使用 docker system 命令。

docker system prune

这是一个“大扫除”命令,它会清理:

  • 所有已停止的容器(stopped containers)
  • 所有悬空的镜像(dangling images)
  • 所有不被任何容器使用的网络(networks)
  • 所有构建缓存(build cache)
docker system prune

注意: 这个命令默认不会删除未被使用的镜像(非悬空的)和数据卷(volumes)。

docker system prune -a

这是更彻底的版本,它会清理 docker system prune 的所有内容,外加

  • 所有没有被任何容器使用的镜像(等同于 docker image prune -a
docker system prune -a

终极清理命令(最危险!)

如果你还想清理掉所有未被任何容器使用的数据卷(Volumes),可以加上 --volumes 标志。数据卷通常包含数据库文件、配置文件等持久化数据,删除前请务必三思!

# ⚠️ 极度危险:会删除所有未被使用的数据卷!
docker system prune --volumes

手动精确清理

有时候你只想删除某一个或某几个特定的镜像。

1. 查看所有镜像

首先,列出你本地的所有镜像,找到你想要删除的目标。

docker images
# 或者 docker image ls

你会看到类似这样的列表:

R m m u < E y y b n P - - u o O a a n n S p p t e I p p u > T O R Y T l v 2 < A a 1 0 n G t . . o e 0 0 n s 4 e t > I a a f d M 1 7 6 3 A b b 4 e G 2 8 3 4 E c c c f 3 9 7 5 I d d 2 a D 4 0 b 6 e e c b 5 1 2 7 f f 5 c 6 2 2 8 C 2 3 5 1 R E h d m d A o a o a T u y n y E r s t D s h a a s g a g o g o a o g o S 1 1 7 9 I . . 2 0 Z 2 1 . 0 E G G 9 M B B M B B

2. 删除指定镜像

使用 docker rmi (remove image) 命令来删除。你可以通过 镜像名:标签 或者 IMAGE ID 来指定。

# 通过 镜像名:标签 删除
docker rmi my-app:v1.0

# 通过 IMAGE ID 删除 (ID不需要写全,只要能唯一识别即可)
docker rmi a7b8c9d0e1f2

可能会遇到的问题:

如果你要删除的镜像正被一个容器(即使是已停止的容器)所使用,Docker 会报错:

E r r o r r e s p o n s e f r o m d a e m o n : c o n f l i c t : u n a b l e t o r e m o v e r e p o s i t o r y r e f e r e n c e " m y - a p p : l a t e s t " ( m u s t f o r c e ) - c o n t a i n e r a 1 b 2 c 3 d 4 e 5 f 6 i s u s i n g i t s r e f e r e n c e d i m a g e a 1 b 2 c 3 d 4 e 5 f 6

解决方法是:

  1. 先删除使用该镜像的容器:docker rm <container_id>
  2. 然后再删除镜像:docker rmi <image_id>

如果你确定要强制删除,可以使用 -f--force 参数。这通常不推荐,因为它会破坏容器与镜像的关联,可能导致容器状态异常。

docker rmi -f <image_id>

高级技巧:根据条件批量删除

你可以结合 docker images 和一些 Shell 命令(如 grep, awk, xargs)来批量删除符合特定条件的镜像。

示例1:删除所有悬空镜像(等同于 docker image prune

docker rmi $(docker images -f "dangling=true" -q)
  • docker images -f "dangling=true": 筛选出所有悬空镜像。
  • -q: 只显示镜像的 ID。
  • $(...): Shell 命令替换,将查询到的 ID 列表作为 docker rmi 的参数。

示例2:删除仓库名为 my-old-repo 的所有镜像

docker rmi $(docker images "my-old-repo" -q)

示例3:删除所有在特定日期之前创建的镜像 使用 --filter "until=..." 标志(需要 Docker 17.06.1+)。240h 表示 10 天。

docker image prune -a --filter "until=240h"