English | 中文
基于实践经验总结的 Docker 未使用资源清理完整指南。
本指南配套提供了 PowerShell 和 Bash 两种自动化清理脚本,可一键完成所有清理操作。
| 平台 | 脚本文件 |
|---|---|
| Windows | Docker_Resource_Cleanup.ps1 |
| Linux | Docker_Resource_Cleanup.sh |
# 交互式清理(推荐首次使用)
.\Docker_Resource_Cleanup.ps1
# 仅分析,不执行删除
.\Docker_Resource_Cleanup.ps1 -AnalyzeOnly
# 自动确认所有删除(谨慎使用)
.\Docker_Resource_Cleanup.ps1 -Force
# 保留基础镜像(alpine, node, nginx 等)
.\Docker_Resource_Cleanup.ps1 -KeepBaseImages
# 组合使用
.\Docker_Resource_Cleanup.ps1 -Force -KeepBaseImages# 添加执行权限(首次使用)
chmod +x Docker_Resource_Cleanup.sh
# 交互式清理(推荐首次使用)
./Docker_Resource_Cleanup.sh
# 仅分析,不执行删除
./Docker_Resource_Cleanup.sh --analyze-only
# 自动确认所有删除(谨慎使用)
./Docker_Resource_Cleanup.sh --force
# 保留基础镜像(alpine, node, nginx 等)
./Docker_Resource_Cleanup.sh --keep-base-images
# 组合使用
./Docker_Resource_Cleanup.sh --force --keep-base-images| Windows 参数 | Linux 参数 | 说明 |
|---|---|---|
-AnalyzeOnly |
--analyze-only |
仅分析模式,显示可清理的资源但不执行删除 |
-Force |
--force |
自动确认所有删除操作,无需交互确认 |
-KeepBaseImages |
--keep-base-images |
保留常用基础镜像(alpine, node, nginx, redis, mysql 等) |
- ✅ 自动分析 Docker 磁盘使用情况
- ✅ 识别未被容器使用的镜像
- ✅ 识别悬空卷并显示归属项目
- ✅ 显示构建缓存使用情况
- ✅ 按正确顺序清理:镜像 → 卷 → 构建缓存
- ✅ 每步操作前交互确认
- ✅ 可选保留基础镜像
Windows:
# 1. 首次使用:先分析查看
.\Docker_Resource_Cleanup.ps1 -AnalyzeOnly
# 2. 确认无误后:交互式清理(保留基础镜像)
.\Docker_Resource_Cleanup.ps1 -KeepBaseImages
# 3. 熟悉后:自动清理
.\Docker_Resource_Cleanup.ps1 -Force -KeepBaseImagesLinux:
# 1. 首次使用:先分析查看
./Docker_Resource_Cleanup.sh --analyze-only
# 2. 确认无误后:交互式清理(保留基础镜像)
./Docker_Resource_Cleanup.sh --keep-base-images
# 3. 熟悉后:自动清理
./Docker_Resource_Cleanup.sh --force --keep-base-imagesDocker 资源之间存在复杂的依赖关系。简单地使用 prune 命令可能无法完全清理所有未使用的资源。本指南提供了一套系统化的方法来识别和清理未使用的镜像、卷和构建缓存。
┌─────────────────────────────────────────────────────────────┐
│ 容器 (运行中/已停止) │
│ ↓ │
│ 挂载卷 │
│ ↓ │
│ 卷 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 镜像 (有标签/无标签) │
│ ↓ │
│ 引用构建缓存 │
│ ↓ │
│ 构建缓存 │
└─────────────────────────────────────────────────────────────┘
| 命令 | 能清理的内容 | 遗漏的内容 |
|---|---|---|
docker image prune |
仅悬空镜像(<none> 标签) |
有标签但未使用的镜像 |
docker volume prune |
仅真正悬空的卷 | 已停止容器引用的卷 |
docker builder prune |
仅未被引用的缓存 | 被未使用镜像引用的缓存 |
如果在删除未使用镜像之前清理构建缓存:
- 被未使用镜像引用的构建缓存无法被清理
- 删除未使用镜像后,这些缓存才变为可回收状态
- 需要再次执行
builder prune才能清理
步骤 1: 识别并删除未使用的镜像
↓ (释放被锁定的构建缓存)
步骤 2: 识别并删除未使用的卷
↓ (独立于其他资源)
步骤 3: 清理构建缓存
↓ (所有可回收缓存现已可用)
完成: 一次性完成全部清理
# 查看整体磁盘使用情况
docker system df
# 列出所有镜像
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
# 列出所有容器(包括已停止的)
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
# 列出所有卷
docker volume ls
# 列出悬空卷
docker volume ls -q --filter "dangling=true"
# 列出构建缓存
docker builder du# 获取所有容器使用的镜像
docker ps -a --format "{{.Image}}" | Sort-Object -Unique
# 与所有镜像对比,找出未使用的
docker images --format "{{.Repository}}:{{.Tag}}"删除镜像前,验证它是否是其他镜像的基础镜像:
# 检查镜像层
docker image inspect <image_name> --format "{{.RootFS.Layers}}"
# 检查镜像标签(获取 compose 项目信息)
docker image inspect <image_name> --format "{{json .Config.Labels}}"# 删除指定的未使用镜像
docker rmi <image_name>:<tag>
# 或删除所有未使用的镜像(谨慎使用!)
docker image prune -a -f重要提示: 如果需要重新构建项目,请保留基础镜像(如 node:alpine、alpine)。
# 列出悬空卷
docker volume ls -q --filter "dangling=true"# 检查卷标签(显示 compose 项目信息)
docker volume inspect <volume_name> --format "{{.Name}} | Labels: {{.Labels}}"
# 检查哪些容器使用了哪些卷
docker ps -a --format "{{.Names}}" | ForEach-Object {
docker inspect $_ --format "{{ .Name }}: {{ range .Mounts }}{{ .Name }} {{ end }}"
}# 先尝试 prune 命令
docker volume prune -f
# 如果 prune 显示 0B 但卷仍然存在,手动删除
docker volume rm <volume_name1> <volume_name2> ...注意: 卷可能显示为"悬空"但仍被已停止的容器引用。务必与容器挂载点进行交叉验证。
# 查看详细缓存使用情况
docker builder du
# 查看详细信息
docker builder du --verbose# 清理所有未使用的构建缓存
docker builder prune -f# 检查剩余缓存(应仅显示共享缓存)
docker builder du
# 最终磁盘使用检查
docker system df# Docker 资源清理脚本
# 查看输出后手动执行每个部分
Write-Host "=== Docker 资源清理 ===" -ForegroundColor Cyan
# 1. 显示当前状态
Write-Host "`n[1] 当前 Docker 磁盘使用情况:" -ForegroundColor Yellow
docker system df
# 2. 查找未使用的镜像
Write-Host "`n[2] 未被容器使用的镜像:" -ForegroundColor Yellow
$usedImages = docker ps -a --format "{{.Image}}"
docker images --format "{{.Repository}}:{{.Tag}}" | Where-Object {
$img = $_; -not ($usedImages | Where-Object { $_ -like "*$img*" })
}
# 3. 查找悬空卷
Write-Host "`n[3] 悬空卷:" -ForegroundColor Yellow
docker volume ls -q --filter "dangling=true"
# 4. 显示构建缓存
Write-Host "`n[4] 构建缓存摘要:" -ForegroundColor Yellow
docker builder du
Write-Host "`n=== 查看以上输出后再执行 ===" -ForegroundColor Cyan
Write-Host "按顺序执行以下命令:" -ForegroundColor Green
Write-Host " docker rmi <未使用的镜像>" -ForegroundColor White
Write-Host " docker volume rm <悬空卷>" -ForegroundColor White
Write-Host " docker builder prune -f" -ForegroundColor White| 用途 | 命令 |
|---|---|
| 磁盘概览 | docker system df |
| 列出所有镜像 | docker images |
| 列出所有容器 | docker ps -a |
| 列出所有卷 | docker volume ls |
| 列出悬空卷 | docker volume ls -f "dangling=true" |
| 列出构建缓存 | docker builder du |
| 检查容器挂载 | docker inspect <container> --format "{{range .Mounts}}{{.Name}}{{end}}" |
| 用途 | 命令 |
|---|---|
| 删除指定镜像 | docker rmi <image> |
| 删除悬空镜像 | docker image prune -f |
| 删除所有未使用镜像 | docker image prune -a -f |
| 删除指定卷 | docker volume rm <volume> |
| 删除悬空卷 | docker volume prune -f |
| 清理构建缓存 | docker builder prune -f |
| 完整系统清理 | docker system prune -a -f(谨慎使用) |
原因: 卷被已停止的容器引用。
解决方案:
# 检查容器挂载点
docker ps -a --format "{{.Names}}" | ForEach-Object {
docker inspect $_ --format "{{ .Name }}: {{ range .Mounts }}{{ .Name }} {{ end }}"
}
# 手动删除卷
docker volume rm <volume_name>原因: 缓存被未使用的镜像引用。
解决方案: 先删除未使用的镜像,然后再清理缓存。
原因: 其他镜像基于此镜像构建。
解决方案: 先删除子镜像,或使用 -f 标志:
docker rmi -f <image_name>- 清理前先分析 - 查看将要删除的内容
- 遵循正确顺序 - 镜像 → 卷 → 构建缓存
- 保留基础镜像 - 如果经常重新构建项目
- 备份重要数据 - 删除卷之前先备份
- 合理使用标签 - 正确的标签有助于识别未使用的镜像
- 定期维护 - 定期执行清理操作
| 顺序 | 资源 | 检查命令 | 清理命令 |
|---|---|---|---|
| 1 | 镜像 | docker images + 容器对比 |
docker rmi <image> |
| 2 | 卷 | docker volume ls -f "dangling=true" |
docker volume rm <vol> |
| 3 | 构建缓存 | docker builder du |
docker builder prune -f |
按照此顺序执行,可确保所有资源被正确识别和清理,避免重复清理操作。