当前位置: 首页 > news >正文

Windows Docker Desktop占用C盘空间过大解决办法集合

一、问题

在Windows系统中安装Docker Desktop时,是无法选择安装的位置的,程序默认将Docker安装到了C盘。在使用Docker的过程中,我们会下载镜像文件,而一个镜像文件动辄10几G,都会被放到C盘里存储Docker数据的磁盘映像文件(.vhdx)中。由于vhdx文件的特性,即使在Docker中删除掉不用的镜像文件,vhdx文件也不会释放存储空间,这样电脑的C盘很快就会被占满。
原来是因为:👉 Docker Desktop的虚拟磁盘(如ext4.vhdx、docker_data.vhdx)在Windows系统中不会自动缩减空间占用。即使实际使用空间远低于最大值,系统仍会保留虚拟磁盘曾经达到的最大容量

其实之前直接也有过类似情况,之前解决方法是直接删除docker重装,但是没有过多久又出现了这个问题,于是我这次打算下定决心要彻底从根源上解决这个问题,于是我开始在网上找了很多种解决方案。

二、背景

Docker占用的磁盘空间主要来自以下几个方面:

  • 镜像(Image): 在日常不断地拉取和构建镜像的过程中堆积的镜像文件
  • 容器(Container): 停止或未使用的容器
  • 卷(Volume): 用于持久化数据的卷
  • 构建缓存(Build Cache): 在构建镜像时产生的缓存文件

其中,卷中有可能涉及数据库以及其他持久化存储的数据,需要谨慎清理;此外如果有频繁构建镜像的需求,构建缓存也应考虑保留。所以我们主要是针对镜像和容器进行清理。

Windows系统下,Docker通常使用WSL2。WSL2本质上是一个虚拟机,而Docker的所有数据都存储在WSL2的虚拟磁盘中(以.vhdx文件的形式),随着时间的推移,这个虚拟磁盘会自动扩容,但并不会自动收缩,因此需要手动进行清理和压缩。

PS: 我的系统环境为Windows 11 家庭版 23H2,Docker版本为Docker Desktop 4.45.0 (203075)。Windows家庭版不支持Hyper-V,所以之后压缩虚拟磁盘的步骤需要使用diskpart命令。

三、解决方案

方案一:迁移映像文件到其他盘

这种方案只适用于C盘以外的其他盘有剩余空间的人,小宁其他盘的空间也比较紧张,所以并没有使用这种解决方案,大家可以参考,尝试一下把WSL迁移到其他磁盘,所以也有了后续的方案二,以下是小编找到的两篇博客,大家可以参考。

docker占用C盘过大的问题:WSL(Windows)一键迁移Docker磁盘_docker c盘-CSDN博客

windows11 安装 docker desktop (包含数据迁移到D盘存储)_docker desktop安装到d盘-CSDN博客

方案二:压缩vhdx文件

后续小宁又在网上找了很多种解决方案,于是找到了一个网上呼声很高的解决办法,这里先把具体的网址给大家:

适用于 Linux 的 Windows 子系统 - Docker 桌面 WSL ext4.vhdx 太大 - Stack Overflow

如何管理 WSL 磁盘空间 | Microsoft Learn

容器化运维:Docker Desktop 占用磁盘空间过大?教你轻松解决!-阿里云开发者社区

下面教一下打击具体的操作步骤:

1、管理员身份打开cmd

2、逐步执行一下指令

解决办法:

①wsl --shutdown 关闭所有WSL,cmd 或 powershell工具都可以

wsl --shutdown

②diskpart 打开工具,会自动新开一个cmd窗口

diskpart

③select vdisk file="<you_path>\docker\disk\docker_data.vhdx" 自己环境下Docker Desktop的虚拟磁盘的路径。

select vdisk file="C:\Users\....\AppData\Local\Docker\wsl\disk\docker_data.vhdx"

④compact vdisk 执行压缩,等待进度跑完

compact vdisk

⑤exit 退出diskpart窗口

exit

最后再启动wsl服务即可,可能还需重启。

可能大家以为这就完了,我也是这么觉得的,但是在很多人使用的方案在我这里缺起不到什么作用,仅仅只给我腾出来了600多MB,让我实在恼火不以,气的我差点又要重装docker,但是我还忍住了,所以后续又有了我的方案三。

方案三:通过指令删除未使用的资源

1、确认当前Docker的磁盘使用情况

docker system df

2. 清理未使用的资源

docker container prune && docker image prune -a

3、更完整的常用清理命令及其作用范围如下:

命令 / 参数删除对象范围说明 / 风险
docker image prune悬空镜像 (<none>)仅删 dangling 层,安全。
docker image prune -a未被任何容器引用的镜像需重拉/重建,运行中容器依赖的不会删。
docker container prune已停止容器不影响运行中容器。
docker volume prune未使用卷会删数据,谨慎使用。
docker network prune未使用自定义网络不含默认网络,一般安全。
docker system prune停止容器、未用网络、悬空镜像、可回收缓存常用清理,不含卷。
docker system prune -a停止容器、未用网络、未引用镜像、缓存更彻底,不含卷。
docker system prune --volumes同上 + 未用卷最激进,卷数据会丢失。
docker builder prune可回收构建缓存可能影响 build 速度。
docker builder prune -a所有构建缓存最彻底,后续 build 变慢。
-f / --force跳过确认提示脚本常用,交互下慎用。

结果最后效果还是微乎其微,刚刚释放出来的内存又被占用了回去了,无奈只有采用暴力手段了。

方案四:暴力清空所有数据(慎用

这种方案虽然肯定能够解决你的内存占用过高的问题,但是也会带来一个问题,就是配置好的docker环境和之前拉取的相关镜像都要重新配置和下载,小宁也是实在无奈才出此下策。

这样一顿处理之后虽然说内存回来了,但是后续可能还是会出现这样的问题,并没有从根源上解决这个问题。

大家有什么其他的更好的解决方案,可以一起交流,帮我彻底解决这个问题。

http://www.dtcms.com/a/477834.html

相关文章:

  • 平面的方程公式
  • 2025年“羊城杯”网络安全大赛 线上初赛 (WriteUp)
  • 网络安全概念之网闸防火墙AI版
  • 学习笔记2: 深度学习之logistic回归梯度下降
  • 网络安全等级测评师能力评估样卷及答案
  • 网站服务器用什么系统网站建设及管理制度文章
  • 网站添加wordpress创意咨询策划公司
  • 企业网站设计专业好吗胶州房产网
  • 环境变量完全指南:用 Vite 把「配置」玩出花
  • 深入解析JAVA虚拟线程
  • 不同设计牙周探针在深牙周袋探查中的精确性与局限性比较
  • 三极管分类
  • Leetcode 3710. Maximum Partition Factor
  • 亚马逊,塔吉特采购测评:高砍单率核心原因及技术破解策略
  • SQLite3数据库——Linux应用
  • 人机关系中“看不见的手”
  • 上街区网站建设做网站用什么系统好
  • k8s cert-manager cert-manager-webhook-xxx pod 证书过期问题处理
  • 宝塔服务器磁盘爆满:占用50G磁盘空间的.forever日志文件处理导致服务崩溃的教训
  • Docker资源限制全解析
  • 毫米级的安全舞蹈
  • 成都网站专业制作一造和一建哪个难度大
  • 解码AI智能体的大脑:Function Calling 与 ReAct 策略深度对决
  • K8s多租户方案指南--图文篇
  • 去一个新公司~重新设置git信息,clone项目 ~需要做的
  • wordpress 自动标签插件廊坊seo推广
  • Abase 数据库:永久关闭 misopt_preventing 选项的方法
  • 基于单片机的智能洗碗机设计
  • 网站策划书ppt9377白蛇传奇
  • 从Wireshark到Mitmproxy:网络数据侦探——抓包工具在爬虫开发中的艺术与科学之“HTTPS全流量解密实战”