docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Windows Docker Desktop磁盘空间清理

Windows Docker Desktop磁盘空间清理步骤完全指南

作者:REDcker

Windows Docker Desktop在长时间使用后,会由于镜像、容器、缓存等文件累积,导致磁盘空间占用过大,这篇文章主要介绍了Windows Docker Desktop磁盘空间清理的相关资料,需要的朋友可以参考下

问题描述

在 Windows 上运行 Docker Desktop 时,可能会发现 docker_data.vhdx 文件占用了大量磁盘空间(例如接近 400GB)。这个文件是 Docker Desktop 使用 WSL 2 后端时,用于存储所有 Docker 数据(镜像、容器、卷、构建缓存等)的虚拟硬盘文件。

问题根源:WSL 2 虚拟硬盘

当您在 Windows 上启用 WSL 2 功能并使用 Docker Desktop 时,它会创建一个或多个 Linux 发行版(如 docker-desktop, docker-desktop-data)在后台运行。您的容器及其所有相关数据(包括层叠的文件系统、写入的数据等)最终都存储在这个名为 docker_data.vhdx 的虚拟硬盘中。

重要特性:这个文件会动态增长以适应您的数据,但默认情况下,即使您删除了 Docker 内部的文件,它也不会自动缩小。这就是它变得如此巨大的原因。

解决方案(从推荐到高级)

请严格按照顺序尝试以下方法,并在操作前确保重要数据已备份。

方案一:使用 Docker Desktop 自带清理(最简单、最安全)

这是首选方法,因为它完全通过 Docker 的管理界面进行,最不容易出错。

  1. 打开 Docker Desktop
  2. 点击右上角的 设置(Settings) 齿轮图标。
  3. 选择左侧的 Resources -> Advanced
    • 这里您可以调整磁盘映像的最大大小,但我们现在不调整,只是查看。记下当前设置。
  4. 选择左侧的 Troubleshoot(或在某些版本中是 Diagnose & Feedback)。
  5. 您会看到几个按钮,点击 Clean / Purge data
    • 警告:这会删除所有 Docker 数据,包括所有镜像、容器、卷和网络。您的容器和数据也会被销毁!请确保您已从容器中 docker cp 出所有重要文件,或者这些文件已通过卷挂载到了 Windows 主机上。

更温和的清理(推荐先试这个):

直接在 Docker Desktop 的 Dashboard 页面,您可以看到所有正在运行和已停止的容器、本地镜像、卷和构建缓存。您可以手动选择不需要的镜像、容器(已退出的)和卷,然后逐个删除。

方案二:使用 Docker 命令进行精细清理(推荐用于日常维护)

这个方法可以更有选择性地清理,避免丢失所有数据。

  1. 打开 PowerShell 或 CMD(以管理员身份运行并非必须,但有时有权限更好)。

  2. 列出并删除所有已停止的容器

    docker container prune

    系统会询问是否继续,输入 y

  3. 删除所有未被使用的镜像(悬空镜像):

    docker image prune
  4. 删除所有未被使用的镜像(包括那些没有标签的,更彻底):

    docker image prune -a

    注意:这可能会删除您之后可能想重用的基础镜像。

  5. 删除所有未被使用的卷极其重要:卷通常用于存储数据库数据等持久化信息,请确认卷中的数据已无用或已备份):

    docker volume prune
  6. 一键清理所有未使用的对象(容器、网络、镜像(悬空)、构建缓存):

    docker system prune
  7. 最彻底的清理(包括所有未被使用的镜像,不仅仅是悬空镜像):

    docker system prune -a --volumes

    再次强调--volumes 参数会删除所有未被容器引用的卷,使用前请三思!

完成以上命令后,Docker 内部的数据已经减少了,但 docker_data.vhdx 文件的大小很可能还没有变化。

方案三:压缩 VHDX 文件(核心步骤!)

这是让虚拟硬盘文件实际变小的关键。我们需要在 WSL 层面进行操作。

  1. 关闭 Docker Desktop:右键系统托盘区的 Docker 图标,选择 Quit Docker Desktop。确保它完全退出。

  2. 列出并关闭所有 WSL 发行版
    打开 PowerShell 或 CMD,执行:

    wsl --list --verbose
    # 或简写
    wsl -l -v

    您会看到类似这样的输出:

    NAME                   STATE           VERSION
    * Ubuntu                 Running         2
      docker-desktop         Stopped         2
      docker-desktop-data    Stopped         2
  3. 强制终止所有 WSL 实例
    为了确保万无一失,运行:

    wsl --terminate Ubuntu
    wsl --terminate docker-desktop
    wsl --terminate docker-desktop-data

    再次运行 wsl -l -v,确保所有状态都变为 Stopped

  4. 优化(压缩)VHDX 文件
    现在针对存储数据的那个发行版(docker-desktop-data)进行操作:

    # 请将路径替换为您的实际路径,通常就在这里
    # 注意:这是一个很长的单行命令
    optimize-vhd -Path "C:\Users\<YourUserName>\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode full

    如何找到路径?

    • 默认路径通常是 C:\Users\<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx
    • 如果找不到,可以在文件资源管理器的地址栏输入 %LOCALAPPDATA%\Docker\wsl\data 直接进入。
    • 您也可以直接在 PowerShell 中运行(如果优化了错误的文件也没关系,只是没效果):
      optimize-vhd -Path "$env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx" -Mode full
    • -Mode full 是最彻底的压缩模式,耗时也最长。
  5. 等待完成并重启 Docker
    命令执行成功后,您会发现 ext4.vhdx 文件的大小显著减小了。现在重新启动 Docker Desktop,它应该会正常启动。

关于 WSL 发行版的说明

WSL 发行版类型

当您运行 wsl -l -v 时,可能会看到类似以下输出:

NAME                   STATE           VERSION
* Ubuntu                 Stopped         2
  Ubuntu2                Stopped         2
  docker-desktop         Stopped         2
  docker-desktop-data   Stopped         2

1.Ubuntu和Ubuntu2

2.docker-desktop和docker-desktop-data

WSL 发行版删除影响总结

WSL 发行版名称来源作用是否可以删除?删除后果
Ubuntu, Ubuntu2用户手动安装独立的 Linux 工作环境可以仅丢失该独立Linux系统内的个人文件
docker-desktopDocker Desktop 自动创建运行 Docker 引擎的核心服务绝对不可以Docker Desktop 无法启动
docker-desktop-dataDocker Desktop 自动创建存储所有 Docker 数据的虚拟硬盘绝对不可以所有 Docker 镜像、容器、卷数据永久丢失

清理步骤建议总结

  1. 第一步:常规清理

    • 使用 Docker Desktop 的 Dashboard 手动删除不需要的容器、镜像和卷
    • 或使用命令行:docker system prune(温和)或 docker system prune -a(彻底)
  2. 第二步:关闭 Docker 和 WSL

    • 完全退出 Docker Desktop
    • 使用 wsl --terminate 确保所有 WSL 实例都已停止
  3. 第三步:压缩 VHDX 文件

    • 使用 optimize-vhd 命令压缩 docker-desktop-data 的虚拟硬盘文件
    • 这是让文件实际变小的关键步骤
  4. 第四步:重启 Docker Desktop

    • 验证 Docker 是否正常工作
    • 检查磁盘空间是否已释放

未来预防措施

  1. 定期清理:养成定期使用 docker system prune -a(或更温和的命令)的习惯。

  2. 使用 .dockerignore:在构建镜像时,使用此文件排除不必要的文件和目录(如 node_modules, .git),可以减小镜像体积。

  3. 多阶段构建:在 Dockerfile 中使用多阶段构建,只将最终需要的文件复制到最终镜像中。

  4. 合理使用卷:将动态数据(如数据库文件)放在卷中,便于管理和备份,也避免在容器内产生大量垃圾文件。

  5. 考虑数据备份策略:对于重要的容器数据,定期将其从容器中拷出或备份卷。

重要提醒

常用清理命令

根据docker system df的结果,选择合适的命令进行清理。

命令作用备注
docker container prune删除所有已停止的容器。相对安全。
docker image prune删除所有"悬空镜像"(即没有标签,且没有被任何容器引用的镜像层)。相对安全。
docker image prune -a删除所有未被容器引用的镜像。较为激进,可能需重新拉取基础镜像,请谨慎使用。
docker volume prune删除所有未被容器引用的卷。卷中的数据是持久化的,被删除后可能丢失重要数据,操作前务必确认卷已无用或已备份
docker builder prune清理构建缓存。对于有频繁镜像构建需求的环境,可考虑保留部分缓存。
docker system prune -a --volumes执行最彻底的清理,会删除所有未使用的容器、网络、镜像和卷。这是核武器级别的命令,请再三确认所有重要数据都已妥善处理后再使用

总结 

到此这篇关于Windows Docker Desktop磁盘空间清理的文章就介绍到这了,更多相关Windows Docker Desktop磁盘空间清理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文