Skip to content

NyaaCaster/Docker_Resource_Cleanup

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Docker 资源清理指南

English | 中文

基于实践经验总结的 Docker 未使用资源清理完整指南。


快速开始:自动化清理脚本

本指南配套提供了 PowerShell 和 Bash 两种自动化清理脚本,可一键完成所有清理操作。

脚本位置

平台 脚本文件
Windows Docker_Resource_Cleanup.ps1
Linux Docker_Resource_Cleanup.sh

Windows (PowerShell) 使用方法

# 交互式清理(推荐首次使用)
.\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

Linux (Bash) 使用方法

# 添加执行权限(首次使用)
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 -KeepBaseImages

Linux:

# 1. 首次使用:先分析查看
./Docker_Resource_Cleanup.sh --analyze-only

# 2. 确认无误后:交互式清理(保留基础镜像)
./Docker_Resource_Cleanup.sh --keep-base-images

# 3. 熟悉后:自动清理
./Docker_Resource_Cleanup.sh --force --keep-base-images

概述

Docker 资源之间存在复杂的依赖关系。简单地使用 prune 命令可能无法完全清理所有未使用的资源。本指南提供了一套系统化的方法来识别和清理未使用的镜像、卷和构建缓存。

资源依赖关系图

┌─────────────────────────────────────────────────────────────┐
│                     容器 (运行中/已停止)                      │
│                              ↓                               │
│                        挂载卷                                 │
│                              ↓                               │
│                           卷                                  │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                     镜像 (有标签/无标签)                      │
│                              ↓                               │
│                      引用构建缓存                             │
│                              ↓                               │
│                         构建缓存                              │
└─────────────────────────────────────────────────────────────┘

核心要点

为什么 prune 命令不够用

命令 能清理的内容 遗漏的内容
docker image prune 仅悬空镜像(<none> 标签) 有标签但未使用的镜像
docker volume prune 仅真正悬空的卷 已停止容器引用的卷
docker builder prune 仅未被引用的缓存 被未使用镜像引用的缓存

清理顺序错误的问题

如果在删除未使用镜像之前清理构建缓存:

  1. 被未使用镜像引用的构建缓存无法被清理
  2. 删除未使用镜像后,这些缓存才变为可回收状态
  3. 需要再次执行 builder prune 才能清理

推荐的清理顺序

步骤 1: 识别并删除未使用的镜像
    ↓ (释放被锁定的构建缓存)
步骤 2: 识别并删除未使用的卷
    ↓ (独立于其他资源)
步骤 3: 清理构建缓存
    ↓ (所有可回收缓存现已可用)
完成: 一次性完成全部清理

详细步骤指南

步骤 1: 分析当前状态

# 查看整体磁盘使用情况
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

步骤 2: 识别未使用的镜像

2.1 查找未被任何容器使用的镜像

# 获取所有容器使用的镜像
docker ps -a --format "{{.Image}}" | Sort-Object -Unique

# 与所有镜像对比,找出未使用的
docker images --format "{{.Repository}}:{{.Tag}}"

2.2 检查构建依赖关系

删除镜像前,验证它是否是其他镜像的基础镜像:

# 检查镜像层
docker image inspect <image_name> --format "{{.RootFS.Layers}}"

# 检查镜像标签(获取 compose 项目信息)
docker image inspect <image_name> --format "{{json .Config.Labels}}"

2.3 删除未使用的镜像

# 删除指定的未使用镜像
docker rmi <image_name>:<tag>

# 或删除所有未使用的镜像(谨慎使用!)
docker image prune -a -f

重要提示: 如果需要重新构建项目,请保留基础镜像(如 node:alpinealpine)。


步骤 3: 识别未使用的卷

3.1 查找悬空卷

# 列出悬空卷
docker volume ls -q --filter "dangling=true"

3.2 检查卷详情和归属

# 检查卷标签(显示 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 }}" 
}

3.3 删除未使用的卷

# 先尝试 prune 命令
docker volume prune -f

# 如果 prune 显示 0B 但卷仍然存在,手动删除
docker volume rm <volume_name1> <volume_name2> ...

注意: 卷可能显示为"悬空"但仍被已停止的容器引用。务必与容器挂载点进行交叉验证。


步骤 4: 清理构建缓存

4.1 删除未使用镜像后,检查缓存状态

# 查看详细缓存使用情况
docker builder du

# 查看详细信息
docker builder du --verbose

4.2 清理构建缓存

# 清理所有未使用的构建缓存
docker builder prune -f

4.3 验证清理结果

# 检查剩余缓存(应仅显示共享缓存)
docker builder du

# 最终磁盘使用检查
docker system df

完整清理脚本 (PowerShell)

# 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(谨慎使用)

常见问题与解决方案

问题 1: volume prune 显示 0B 但悬空卷仍然存在

原因: 卷被已停止的容器引用。

解决方案:

# 检查容器挂载点
docker ps -a --format "{{.Names}}" | ForEach-Object {
    docker inspect $_ --format "{{ .Name }}: {{ range .Mounts }}{{ .Name }} {{ end }}"
}

# 手动删除卷
docker volume rm <volume_name>

问题 2: 构建缓存未完全清理

原因: 缓存被未使用的镜像引用。

解决方案: 先删除未使用的镜像,然后再清理缓存。

问题 3: 无法删除镜像 - "has dependent child images"

原因: 其他镜像基于此镜像构建。

解决方案: 先删除子镜像,或使用 -f 标志:

docker rmi -f <image_name>

最佳实践

  1. 清理前先分析 - 查看将要删除的内容
  2. 遵循正确顺序 - 镜像 → 卷 → 构建缓存
  3. 保留基础镜像 - 如果经常重新构建项目
  4. 备份重要数据 - 删除卷之前先备份
  5. 合理使用标签 - 正确的标签有助于识别未使用的镜像
  6. 定期维护 - 定期执行清理操作

总结

顺序 资源 检查命令 清理命令
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

按照此顺序执行,可确保所有资源被正确识别和清理,避免重复清理操作。

About

Docker资源清理(Docker Resource Cleanup)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors