Docker Desktop 清理后磁盘没变小:定位虚拟磁盘占用

Docker Desktop 清理后磁盘没变小:定位虚拟磁盘占用原创封面

先区分两层空间变化

在 Windows 的 Docker Desktop 环境中,Linux 容器通常运行在虚拟化后端里。清理镜像或缓存以后,引擎内部可以获得空闲空间,但保存该文件系统的外层虚拟磁盘文件未必立即缩小。因此,Docker 用量下降与 Windows 磁盘剩余空间不变可以同时发生。排查时需要分别记录引擎对象用量、虚拟磁盘内部文件系统和宿主机分配。不能因为资源管理器里的文件仍然很大,就继续删除数据库卷;那是在用业务数据换取一个尚未定位的外层文件变化。

本文以 WSL 后端为主要讨论对象。Docker Desktop 的版本、安装历史和后端设置会影响数据磁盘组织方式,不能假定每台机器都存在同名发行版和同一路径。第一步应记录版本与后端,再从应用设置和官方说明确认磁盘位置。如果实际上使用 Windows 容器或其他后端,应切换到对应的检查方法。后续出现的路径都是示例,维护时必须用本机确认过的目标;不能从文章中复制一个猜测路径就执行压缩或删除。

用相同上下文确认内部清理结果

清理前后运行 docker context show 与 docker system df -v,确保比较的是同一套引擎。若构建缓存来自独立构建器,还要检查对应的 Buildx 用量。关注镜像、缓存、容器和卷的变化,避免仅比较某个总数字。共享层与仍在使用的记录可能限制实际回收,这与虚拟磁盘是否收缩是不同的问题。先确认命令执行成功并解释引擎内的剩余占用,再调查外层文件,能够防止同时混入对象引用和磁盘分配两种原因。

如果容器中存在业务数据库,应先确认它还能启动和读取必要数据。空间维护不应该跳过业务验收:某项删除操作即使返回成功,也可能清掉此前没有识别的持久化状态。对仍需保留的卷建立清单,并停止扩大清理范围。若引擎内部空间并未减少,优先查共享层、其他构建器和日志;若内部确实有空闲,而宿主机未释放,则再进入虚拟磁盘这一层。两种情况需要不同的处理入口。

容量、文件长度与实际分配各有含义

虚拟磁盘可以为内部文件系统呈现较大的可用容量,而宿主机文件按需要增长。内部看到的总容量,并不意味着 Windows 已经为它预留同样大的实体空间。另一方面,文件的逻辑长度与文件系统为它实际分配的空间也可能不同,尤其涉及稀疏文件时。记录占用时,应明确使用的是哪一种数值。仅把内部 df 的总容量与资源管理器中的文件大小相减,并不能得到可回收空间,也不能据此判断存在泄漏。

可以用 PowerShell 查看已确认磁盘文件的路径、长度和属性,再通过系统提供的文件属性检查实际占用。内部文件系统的用量,应在对应环境中用其支持的工具读取。不要为了统计而挂载或修改未知的磁盘文件,读取文件信息已经能回答一部分问题。若实际占用来自另一个 WSL 发行版的虚拟磁盘,Docker 的清理当然不会影响它。先辨认文件归属,是处理多发行版开发机时不可省略的一步。

找到当前版本正在使用的磁盘

Docker Desktop 设置中的资源与磁盘相关选项,可以帮助确认存储位置。不同版本显示的选项可能有所变化,应以当前界面和官方维护说明为准。历史安装目录中遗留的磁盘、手动迁移的副本和当前工作磁盘可能同时存在。判断正在使用的文件时,需要结合后端配置与更新时间,不能只选择文件名最像 Docker 的那一个。对来源不清楚的文件,先保留并继续确认,避免把可用于恢复的旧副本当成无用缓存。

WSL 发行版列表可以补充说明当前有哪些环境,但 Docker Desktop 管理的数据结构可能随版本变化。某个名称没有出现在列表中,并不证明对应数据已经废弃。若准备移动存储位置,应使用产品支持的迁移入口,并预留足够目标空间,完成以后再核对路径与容器数据。不要在应用运行时手工拖动虚拟磁盘,也不要把 Windows 中的文件管理操作等同于 Linux 文件系统内部的安全维护。外层文件和内层数据需要协调。

维护之前先准备可恢复的数据

虚拟磁盘整理涉及存储维护,应该先保护必要的数据库和上传文件。数据库备份需要使用其支持的一致性方法,之后在独立目标验证恢复。镜像和构建缓存可以根据源码重建,但人工形成的数据不能依靠重新构建找回。若选择复制整个数据磁盘作为恢复材料,应按 Docker Desktop 的备份要求停止相关进程,确认文件处于可以一致复制的状态,并验证副本的用途。运行中复制的大文件,不应被默认标记为可靠备份。

维护窗口还需要考虑其他 WSL 发行版和正在使用 Docker 的工具。关闭 Docker Desktop 或执行 WSL 关闭操作,可能中断开发服务与终端任务。应先保存工作、停止需要一致退出的数据库,并确认没有构建在写入。备份和维护最好分别留出时间:没有验证备份时,不要因为清理已经开始就省略后续检查。这里不要求把开发机维护写成复杂流程,但每一个涉及唯一数据副本的动作,都应有能够说明的恢复条件。

选择当前后端支持的整理方式

如果当前版本提供磁盘回收或维护入口,可以优先按产品说明执行。通用的虚拟磁盘压缩工具存在适用条件,例如磁盘类型和挂载状态要求;它们并不是对任意文件运行以后就一定缩小。Microsoft 的 compact vdisk 文档针对动态扩展虚拟磁盘说明操作条件,使用前需要确认目标满足这些条件,并正确选择已经核对的磁盘。不要对活动磁盘直接尝试,也不要把创建、附加、扩容和压缩命令混在同一段未经验证的脚本里。

整理结果受到内部空闲空间、文件系统与宿主机分配方式影响,不能提前承诺可以收回多少容量。也不应为了获得更大的压缩比例,在数据库目录里随意删除文件或向文件系统填满零数据。若产品说明与通用工具的前提不一致,应停止套用通用命令,回到当前后端的官方维护方法。清空产品数据、恢复出厂设置与整理已有磁盘是不同动作,前者可能删除镜像、容器和卷,不能作为普通压缩失败后的自动下一步。

维护后如何完成对照检查

操作完成后,先确认 Docker Desktop 正常启动,命令可以连接预期上下文,再检查容器、卷和构建器。启动保留的服务,核对数据库查询与上传资源读取。接着比较同一个磁盘文件的实际占用、Windows 分区剩余空间和引擎内部用量。记录观察时间,排除其他下载、构建和备份任务同时增长造成的干扰。若外层占用没有明显变化,应如实记录,不要通过再次删除业务对象强行制造更好看的结果。

还应确认产品仍在使用预期的存储位置。某些维护或重建步骤可能创建新的空环境,命令能运行并不等于旧数据已经恢复。检查熟悉的容器名称只是线索,关键仍是实际业务数据。对备份恢复的验证,要记录具体读写与必要对象检查;没有执行的项目只能保留为待验证。保持这些区分,能够避免把应用启动成功误写成所有数据已验收,也能让后续排查准确知道是哪一层仍然存在问题。

防止同样的问题反复积累

日常控制应覆盖构建缓存预算、旧镜像保留、应用日志轮转和宿主备份保留。虚拟磁盘整理处理的是已经出现的外层分配,不会改变持续写入的原因。如果缓存每天快速增长,或者日志长期无限保留,即使压缩成功也可能很快重新变大。可定期观察内部与外部两套指标,把增长来源记录下来。这样维护窗口就能根据趋势安排,减少磁盘突然告警时尝试陌生命令的压力。

为团队文档保存后端类型、存储位置的确认方法和恢复入口,比写死某个本地路径更稳妥。更换电脑或升级产品以后,再重新核对这些信息。文章中的步骤适合用于解释和定位,不替代当前版本的存储维护要求;加密磁盘、特殊卷驱动和企业管理策略还可能增加额外限制。把对象清理与虚拟磁盘整理分清以后,磁盘数字没有马上变化就有了可调查的方向,维护也能够围绕真实的存储层展开。

实现片段

docker context show
docker system df -v
docker buildx ls
wsl.exe --list --verbose
# 从当前 Docker Desktop 设置核实路径后,替换这个示例值
$diskPath = 'D:\Example\docker-data.vhdx'
Get-Item -LiteralPath $diskPath | Select-Object FullName, Length, Attributes
# 压缩前需备份并满足官方工具的磁盘类型、脱机或只读条件
# 此处不自动选择或修改虚拟磁盘

一手参考资料

评论 · 0

还没有评论留下第一句经过思考的话。

游客评论需审核。注册后可直接公开,无需审核。

SHARE / 分享

分享这篇文章

WECHAT / 微信

用微信扫一扫

在手机微信中打开文章后,再从微信右上角分享给朋友或朋友圈。