Docker镜像清理
总结
命令 | 功能 | 安全性 |
---|---|---|
docker image prune |
清理悬空镜像 | 非常安全 |
docker image prune -a |
清理所有未被容器使用的镜像 | 比较安全(但可能删除你想保留的) |
docker system prune |
全面清理(容器、网络、悬空镜像) | 比较安全 |
docker system prune -a |
更彻底的全面清理(包括未使用的镜像) | 小心使用 |
docker rmi <image> |
手动删除指定镜像 | 安全(有保护机制) |
docker system prune --volumes |
清理所有,包括数据卷 | 高风险! |
建议的清理流程:
- 定期运行
docker image prune
来做日常维护。 - 当磁盘空间紧张时,运行
docker system prune
或docker image prune -a
进行一次更彻底的清理。 - 对于不再需要的特定项目镜像,手动使用
docker rmi
删除。
懒人包(推荐的快速方法)
对于大多数日常清理,下面这几个命令就足够了。
1. 清理悬空镜像(Dangling Images)
悬空镜像是那些没有标签(tag 显示为 <none>
),并且没有任何容器在使用的镜像。它们通常是在你重新构建一个已存在的镜像时产生的。
这是最安全、最常用的清理命令:
docker image prune
执行后,它会提示你确认是否要删除这些悬空镜像,并显示可以释放多少空间。输入 y
即可。
如果你不想看到确认提示,可以直接加上 -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
你会看到类似这样的列表:
2. 删除指定镜像
使用 docker rmi
(remove image) 命令来删除。你可以通过 镜像名:标签 或者 IMAGE ID 来指定。
# 通过 镜像名:标签 删除
docker rmi my-app:v1.0
# 通过 IMAGE ID 删除 (ID不需要写全,只要能唯一识别即可)
docker rmi a7b8c9d0e1f2
可能会遇到的问题:
如果你要删除的镜像正被一个容器(即使是已停止的容器)所使用,Docker 会报错:
解决方法是:
- 先删除使用该镜像的容器:
docker rm <container_id>
- 然后再删除镜像:
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"