装Docker如果无脑下一步,默认会放在C盘,等C盘飘红再回头折腾就麻烦多了。这篇笔记是我自己在Windows上把Docker安装到D盘的全过程,包含安装器参数、WSL2虚拟磁盘迁移、数据路径修改和几个比较容易踩的坑。如果你正准备装Docker,或者已经装完但C盘吃紧,都可以照着操作,思路比默认安装干净不少。
1. 先想清楚:"指定目录"到底要指定哪几块
很多人在装Docker之前,以为"安装到指定目录"就是把安装包解压到你想要的盘符。但实际上,Docker Desktop在Windows上的落盘位置远不止安装目录这一处。搞清楚"指定目录"要指定几块地方,后面操作才不会漏。
Docker Desktop安装到Windows之后,主要数据会分布在下面几个位置:
- Docker Desktop程序本体:默认在
C:\Program Files\Docker\Docker,包含主程序、CLI工具和部分组件。 - WSL2相关发行版数据:Docker Desktop会基于WSL2运行引擎,通常在
%LOCALAPPDATA%\Docker\wsl(也就是C:\Users\你的用户名\AppData\Local\Docker\wsl)下生成docker_data.vhdx等虚拟磁盘文件。 - 镜像、容器、卷的数据:这些数据并不直接存放在安装目录里,而是存放在WSL2的
vhdx虚拟磁盘中。因为Docker引擎的所有底层写入,最后都会落在WSL2的虚拟磁盘文件上。 - Docker配置和下载缓存:Windows下部分配置文件、登录凭据、代理设置等位于
%APPDATA%\Docker和%LOCALAPPDATA%\Docker。
为什么说默认安装会吃C盘?因为安装目录在C盘之外,%LOCALAPPDATA%仍然在C盘,WSL2默认生成的vhdx也会在C盘用户目录下。换句话说,哪怕你通过某些方式把程序本体放到了D盘,只要Docker引擎的虚拟磁盘还留在C盘,你的镜像和容器数据依然会挤占C盘空间。时间一久,你会看到C盘可用空间一点点消失,但D盘几乎没动静。
所以这篇文章里说的"指定目录",完整目标有两层:
- Docker Desktop程序本体放在D盘(或任意非系统盘)。
- Docker引擎的数据盘,也就是WSL2的
vhdx文件,也搬到D盘(或任意非系统盘)。
只有两步都做了,才算真正意义上的"安装到指定目录"。
2. 安装前的准备:虚拟化和系统版本,别等到装一半才报错
Windows上装Docker Desktop,底层依赖WSL2,而WSL2又依赖虚拟化功能。如果CPU虚拟化没开启,或者系统没有启用"虚拟机平台"和"适用于Linux的Windows子系统",安装过程或者首次启动时就会出现各种莫名其妙的报错。为了不在半路卡住,先把环境检查这一步走完。
2.1 确认CPU虚拟化已开启
打开任务管理器,切到"性能"标签页,找到CPU那一项,看右下角是否显示"虚拟化:已启用"。如果显示"已启用"就没问题;如果显示"已禁用",需要进入BIOS/UEFI设置,找到Intel Virtualization Technology或AMD SVM Mode,把它打开,然后重启系统。
在部分笔记本上,即使BIOS里开启了虚拟化,Windows安全中心的相关隔离设置也可能影响WSL2正常使用。可以做一次额外检查:在"Windows安全中心"里找到"设备安全性"→"内核隔离详细信息",确认"内存完整性"没有和其他虚拟化功能冲突。如果之前开过Hyper-V或者安卓模拟器,这部分需要格外注意。
2.2 启用WSL2和虚拟机平台功能
用管理员身份打开PowerShell,依次执行下面两条命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完成后重启系统。重启后在管理员PowerShell中把WSL2设为默认版本:
wsl --set-default-version 2如果你之前完全没有装过WSL,wsl命令可能会提示需要安装内核组件。Windows 11的较新版本会自动在wsl --update之后完成内核更新,Windows 10则需要手动下载并安装WSL2内核更新包。把内核装好之后,再执行一次wsl --version,能看到版本信息就可以了。
2.3 家庭版与专业版的差异说明
我先说结论:Windows 11家庭版、专业版都可以用WSL2跑Docker Desktop,并不强制要求"专业版才能开Hyper-V"。新版本的Docker Desktop通过WSL2后端就可以跑起来,家庭版也能正常使用。和我交流过的玩家中,也有在Windows 10家庭版上一直稳定运行的例子,只是系统版本需要保持在较新的补丁状态。
如果你的机器比较老旧,或者系统停留在Windows 10早期版本,就不用白费劲了——直接升级系统或者换一台支持虚拟化的设备,反而省时间。安装前顺手跑一下systeminfo,在输出里找到Hyper-V要求那一栏,也能确认当前硬件和系统是否满足基本的虚拟化要求。
2.4 下载Docker Desktop安装包
去Docker官方页面下载Windows版本的安装包,文件名通常是Docker Desktop Installer.exe。下载的时候注意一下,页面会区分AMD64和ARM64,按自己CPU架构选。到了安装环节,这个安装包既可以用图形界面安装,也可以用命令行参数安装。我们这次用命令行参数,才能在第一步就把程序本体放到指定盘。
3. 用安装器参数指定安装目录,把程序本体放到D盘
Docker Desktop的安装器支持静默安装和一些定制参数。官方文档里没有把每一个参数都写在显眼位置,我也是在反复试验之后确认了下面这几个参数的用法。
3.1 常用参数说明
以管理员身份打开命令行工具(cmd或PowerShell,在Docker Desktop Installer.exe所在目录下执行),核心参数如下:
Docker Desktop Installer.exe install --installation-dir=D:\Docker --accept-license参数拆解:
install:表示执行安装,而不是仅解压。--installation-dir=D:\Docker:指定程序安装位置,可以按你的需求改成E:\Docker等任意路径。--accept-license:跳过许可协议的交互确认,配合静默安装使用。
还可以追加--quiet参数让安装过程不弹任何界面,但建议第一次安装时不要完全静默,保留一个进度窗口,可以看到卡在哪一步。我实际操作时用的是:
Docker Desktop Installer.exe install --installation-dir=D:\Docker --accept-license --quiet安装过程会持续几分钟,期间安装器会自动创建WSL发行版。等到命令行窗口回到可输入状态,安装基本就结束了。注意:Windows会弹出UAC(用户账户控制)确认框,必须点是,不然命令会因为没有管理员权限而失败。
3.2 检查程序本体是否真的装到了D盘
安装完成后,去D:\Docker目录看一下,应该能看到Docker子目录和相关的exe、dll文件。如果不放心,可以直接在Windows的"已安装的应用"列表里找到Docker Desktop,看它的安装位置字段。
我第一次操作的时候,就因为参数拼写错误导致程序装回了C盘——当时我以为参数是--install-location,结果安装器直接忽略了这个参数,全程安静地装到了默认位置。所以要特别提醒:参数确实是--installation-dir,不是--install-location。参数错误时安装器不会报错,只会默默跑默认安装,这一点的迷惑性很强。
3.3 首次启动前的设置
装好程序本体只是第一步,启动Docker Desktop之前,最好进入Settings确认一下"Use the WSL 2 based engine"已勾选。Docker Desktop的通用设置(General)里,如果出现"Use WSL 2 based engine"选项,保持开启即可。这样引擎会跑在WSL2上,效率比旧版Hyper-V后端更高,也能配合后面的数据迁移操作。
4. 重头戏:把Docker的数据目录(WSL虚拟磁盘)迁到指定盘
程序本体到D盘之后,真正占空间的大头问题还没解决:Docker的默认数据盘还在C盘。这一步是整个笔记里最容易踩坑的地方,值得单独开一小章,把原理、两种迁移方案和我的实测结论说清楚。
4.1 为什么数据大头在vhdx文件里
Docker Desktop在WSL2上跑引擎,所有的镜像层、容器写入、数据卷都会落到WSL2发行版对应的虚拟磁盘文件里,也就是docker_data.vhdx。这个文件随着你拉取的镜像增多而膨胀,几百MB的镜像拉几十个,很快就能到几十GB。如果构建缓存多、清理不及时,上百GB也有可能。
而Docker Desktop在设置里提供的"Disk image location"(磁盘镜像位置)选项,很多版本下只是调整存放某些元数据的位置,并不能直接把你现有的vhdx整个搬走。要彻底把数据盘迁到D盘,最保险的做法就是下面两种迁移方案。
4.2 方案一:导出再导入WSL发行版(推荐)
这是社区里用得最多的做法,操作逻辑清晰,而且不容易破坏数据。
先关闭Docker Desktop和所有WSL进程。在管理员PowerShell中执行:
wsl --shutdown然后查看当前WSL中与Docker相关的发行版:
wsl -l -v输出里通常能看到两个和Docker有关的发行版,名字一般是docker-desktop和docker-desktop-data。docker-desktop-data才是真正承载镜像数据的那一个。
把docker-desktop-data导出成一个tar文件:
wsl --export docker-desktop-data D:\docker-backup\docker-desktop-data.tar导出完成后,注销原来的发行版(这一步不会删除tar文件,只是把当前的虚拟磁盘"释放掉"):
wsl --unregister docker-desktop-data然后重新导入,同时指定新的存储路径:
wsl --import docker-desktop-data D:\Docker\docker-data\ D:\docker-backup\docker-desktop-data.tar这里D:\Docker\docker-data\是新的vhdx文件存放目录,tar文件路径是刚才导出的备份。导入完成之后,检查一下:
wsl -l -v看到docker-desktop-data还在列表里,状态是正常即可。D:\Docker\docker-data\目录下也会出现新的ext4.vhdx文件(WSL2导入后默认生成的名字,Docker会继续使用它)。
最后重启Docker Desktop,等它自动把docker-desktop和docker-desktop-data关联起来。启动成功后拉一个镜像测试,就会看到新目录里的vhdx文件在增长,C盘的Docker虚拟磁盘不再增加。
4.3 方案二:直接移动vhdx文件
这种方案适合已经知道默认vhdx具体路径,并且Docker Desktop版本能适应手动指定路径的情况。操作上需要找到docker-desktop-data发行版的默认存放目录,通常是:
C:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx先执行wsl --shutdown关闭所有WSL进程,然后把这个vhdx文件移动到D盘的目标目录,比如D:\Docker\docker-data\ext4.vhdx。接着修改用户目录下的.wslconfig文件,加入如下内容:
[wsl2] swap=0严格来说,.wslconfig里没有直接的docker-desktop-data路径配置项;Docker Desktop主要依据发行版注册信息定位vhdx。手动移动文件后,如果不重新注册,Docker Desktop很可能找不到发行版。所以方案二表面上省事,实际上很容易把Docker Desktop弄到无法启动。我自己的建议是:不要把方案二作为首选。如果你想省下重新导入的时间,也可以移动文件后,手动更新注册表或重置发行版配置,但这个流程对普通用户来说过于折腾,而且出错了排查难度大。老老实实用方案一的wsl --export+wsl --import反而最稳。
4.4 迁移后的路径确认
完成迁移后,用下面的命令确认发行版路径已经指向D盘:
wsl -l -v Get-ChildItem D:\Docker\docker-data还可以在WSL中确认:
wsl -d docker-desktop-data -- df -h正常情况能看到磁盘挂载在使用中。下一步继续做收尾配置。
5. 迁移后的收尾:修改数据存储配置、清理C盘残留
数据盘迁移完成不代表万事大吉。Docker Desktop自身的设置里,有些路径还需要手动核对,C盘残留的旧文件也需要清理,否则等于白忙。
5.1 检查Docker Desktop的Resource设置
打开Docker Desktop的Settings,找到"Resources"中的"Advanced"或"Disk"相关选项。如果版本里有"Disk image location"之类的设置,把它指向新的数据目录(例如D:\Docker\docker-data)。不同版本的界面文字略有差异,但原则是:所有和"磁盘镜像""数据目录"有关的路径,都改动到D盘对应目录。
还需要注意,Docker引擎的存储驱动数据都在WSL发行版里,这个路径设置更多是"让Docker Desktop知道从哪里找数据"。只要方案一的导入路径正确,Docker Desktop启动后会自动识别。
5.2 清理C盘残留的旧文件
迁移成功后,C盘原来的C:\Users\你的用户名\AppData\Local\Docker\wsl目录下应该已经没有大的vhdx文件了,如果确认里面只剩下一些无用配置文件,可以删除。我的操作习惯是分两步走:
- 先删除旧虚拟磁盘目录下的所有文件,但不立即回收空间,观察几天,确定Docker Desktop完全正常后再清空回收站。
- 原
%LOCALAPPDATA%\Docker下如果有大量缓存文件,确认不再需要后一并清理。
清理时留意一下C:\ProgramData\Docker之类的目录是否存在大文件,这也是常见隐藏空间杀手。如果Docker Desktop之前运行过,install目录里可能会残留日志和临时文件,删掉不影响运行。
5.3 完整验证流程
迁移完成后我习惯跑一套完整的验证,确认环境真的搬到D盘了:
wsl --shutdown docker version再拉取一个小镜像并运行容器:
docker pull alpine docker run --rm alpine echo ok拉取镜像后,立刻到D:\Docker\docker-data\ext4.vhdx看文件大小变化。如果文件确实变大了,说明新容器和数据都写到了D盘。如果在C盘的原目录中看不到明显的文件增长,迁移就算成功了。
再检查Windows的磁盘空间:
Get-PSDrive C, D | Select-Object Name, Used, Free对比迁移前后的C盘可用空间,有条件的场景下应该能恢复几个GB以上。如果前后没有变化,很可能是还有残留的vhdx文件没有删除,或者有别的程序在C盘写入大量数据。
6. 常见报错与排查:我在迁移过程中踩过的坑
这篇笔记之所以叫"个人笔记",很大程度上是因为我在这个流程里踩过不少坑。如果按默认路径安装再迁移数据,基本会遇到下面几个问题,提前列出来,能省很多排查时间。
6.1 WSL2启动报 0x80370102
这个报错通常出现在首次启动Docker Desktop时,原因是Windows的虚拟机平台没有正确启用,或者CPU虚拟化被其他程序占了。排查方法:管理员PowerShell里执行下面命令,确认这些功能都已启用。
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform如果状态是Disabled,先启用再重启。如果功能都是Enabled,还报同样错误,检查BIOS虚拟化是否开启。老机型上,这一步几乎能解决80%的问题。
6.2 vhdx迁移后Docker Desktop无法启动
这个问题在直接移动vhdx文件时最容易出现,Docker Desktop启动后一直显示引擎正在启动,或者直接提示找不到WSL发行版。我的排查思路:
- 执行
wsl -l -v,看看docker-desktop-data是否还在列表中。 - 进入
D:\Docker\docker-data目录,看是否存在ext4.vhdx。 - 如果发行版丢失或路径不对,重新执行
wsl --import导入一次。
方案一操作规范的情况下,这个问题基本不会发生。一旦遇到,优先重新导入,而不是手动修改注册表。手动改注册表虽然理论上可行,但牵扯Docker Desktop与WSL的关联关系,改错一步就得重装。
6.3 磁盘明明很大,却提示空间不足
有朋友遇到过这种情况:D盘还有几百GB,Docker Desktop却提示磁盘空间不足。原因往往在于Docker Desktop的部分缓存仍然留在C盘,或者说引擎的ROOT目录被指定回了C盘。排查时进入Docker Desktop的Settings,把所有指向本地存储的路径都改到D盘对应目录。还有可能是Windows的临时目录把C盘塞满了,需要清理%TEMP%和C:\Windows\Temp里的临时文件。
6.4 什么时候适合用符号链接绕行
如果你实在不想使用wsl --export+wsl --import,还有一种比较取巧的办法:把C:\Users\你的用户名\AppData\Local\Docker目录做成一个到D盘的符号链接。具体做法是先把原目录整体移动到D盘,然后在原位置创建一个指向D盘目标的符号链接:
mklink /J "C:\Users\你的用户名\AppData\Local\Docker" "D:\Docker\LocalDocker"这样Docker Desktop访问原路径时,实际上读写的是D盘。这个方法适合已经装好Docker、不想重新折腾WSL发行版的情况。但要注意:符号链接在处理跨盘移动时,某些软件会对路径解析有额外限制,Docker Desktop有些版本不一定会完全买账。我实测下来还是一个稳妥一个折腾,各有取舍。
6.5 迁移之后Docker数据依然写在C盘的排查
这种问题多半是docker-desktop-data发行版没有正确注册到新路径。再走一遍wsl --unregister docker-desktop-data和wsl --import的流程即可。日常维护中,我偶尔也会用下面的命令快速确认各发行版的数据目录位置:
wsl -l -v如果发现Docker Desktop重新创建一个新的发行版,大概率是之前的发行版数据损坏或者导入路径不对,优先修复发行版注册关系。
7. 后续维护:定期清理和查看数据位置
把Docker装到指定目录只是开始,日常使用中我比较注意几件事:定期清理无用的镜像和构建缓存,避免vhdx无限膨胀;定期查看一下C盘和D盘的空间占用;在对系统做较大更新前,顺手看一眼WSL发行版的存储路径是否还是预期状态。
7.1 清理无用镜像和构建缓存
Docker的构建缓存很容易在不知不觉中塞满磁盘。我平时会定期执行:
docker system df docker image prune -f docker builder prune -fdocker image prune -f会删除所有悬空镜像,docker builder prune -f会清理构建缓存。如果Vhdx文件已经膨胀得很大,即使删除了镜像,vhdx文件占用的宿主磁盘空间也可能不会立刻回收。这种情况可以把docker数据再做一次导出、删除、再导入的循环,把vhdx里的"空洞"释放掉,C盘空间能明显恢复。
7.2 用WSL命令检查Docker数据位置
执行wsl -l -v能看到发行版列表和状态,如果需要更详细的信息,可以查看WSL发行版的VHD路径:
wsl -l -v Get-ChildItem D:\Docker\docker-data确认ext4.vhdx存在且修改时间能跟上你拉镜像的时间点。如果修改时间一直不变,说明镜像数据没写到这里,路径设置大概率有问题。
7.3 个人习惯:镜像多就开个定时任务
如果你平时镜像很多,或者经常做构建,建议在Windows任务计划程序里加一个简单的提醒或清理脚本,每周末执行一次清理命令。这样vhdx文件不会猛增到不可收拾的程度。我自己的环境里,每周清理一次,D盘空间常年稳定,根本不需要频繁扩容。
7.4 为什么我不推荐在安装后频繁切换数据路径
有些朋友喜欢定期把数据目录换换位置,或者把vhdx从D盘又搬回C盘。我不太推荐这样做。WSL发行版的移动不像普通文件夹拷贝,过程中一旦出现中断、断电、权限问题,虚拟磁盘文件就容易损坏。与其反复折腾,不如一开始就决定好最终的数据盘位置,用方案一迁移一次,之后稳定使用。对绝大多数人来说,安装时用命令指定程序目录,安装后导出导入一次数据,整个过程半小时内就能完成,换来的是长期不用操心C盘空间。
这套流程整体跑下来,效果已经验证了很多次:Docker Desktop程序在D盘,镜像数据也在D盘,C盘不再被docker的文件拖着走。如果你正好有类似需求,按这份笔记操作就行,最后注意一点,每次执行wsl --shutdown之前,让Docker Desktop彻底退出,托盘图标也没了再操作。这样迁移过程中数据会更安全。