Docker 在 Windows 上的安装,看起来就是下载一个安装包、双击、下一步的事,但真正动手做过的人都知道,这里面的门道比想象中多得多。尤其是当你的系统盘只有可怜的一两百个 G,而 Docker 默认把所有镜像、容器、数据卷全塞在C:\Users\你的用户名\AppData\Local\Docker下面时,用不了几天系统盘就飘红了。更别提国内网络环境下拉取镜像那个龟速,不配镜像源基本没法用。
这篇内容就是把我自己在 Windows 上反复装 Docker、迁移数据目录、调优镜像源这一整套流程完整梳理出来。不管你是刚接触容器的新手,还是已经用过一段时间但一直被 C 盘空间困扰的老用户,都能从里面找到可以直接抄作业的步骤。核心关键词就三个:Docker 安装、修改默认安装路径、镜像源配置,围绕这三个点,我会把每一步为什么这么做、不这么做会怎样、踩过哪些坑,全部讲清楚。
1. 装之前先想清楚:你到底需要哪种 Docker 运行方式
很多人一上来就搜“Docker 安装教程”,然后照着某个博客一顿操作,结果装完发现要么启动不了,要么性能拉胯。问题出在没搞清楚 Windows 上跑 Docker 的几种底层方案。
1.1 Docker Desktop + WSL2 后端:目前最推荐的主流方案
Windows 上跑 Docker 本质上是在跑一个 Linux 虚拟机,因为容器技术依赖 Linux 内核的 namespace 和 cgroup 特性。Docker Desktop 提供了两种后端:一种是基于 Hyper-V 的传统方式,另一种是基于 WSL2 的方式。现在官方主推的是 WSL2 后端,原因很直接——WSL2 本身就是一个轻量级虚拟机,启动快、内存占用低、文件系统性能好,而且和 Windows 的互操作性做得越来越成熟。
用 WSL2 后端的好处是,你的 Docker 引擎实际跑在一个叫docker-desktop的 WSL 发行版里,镜像和容器数据都存放在这个发行版的虚拟磁盘文件里。这个虚拟磁盘文件默认位置同样在 C 盘,所以后面要改路径,改的其实就是这个虚拟磁盘的位置。
1.2 为什么我不建议用 Hyper-V 后端
Hyper-V 后端是早期 Docker Desktop 的默认选项,但它的缺点很明显:需要 Windows 专业版或企业版才能开启 Hyper-V,家庭版用户直接被拒之门外;启动一个完整的 Hyper-V 虚拟机比 WSL2 重得多,内存占用经常飙到 2G 以上;而且 Hyper-V 和某些虚拟化软件(比如 VMware、VirtualBox)存在冲突,开了 Hyper-V 之后那些软件可能就跑不起来了。所以除非你有特殊需求,否则一律选 WSL2。
1.3 系统要求自查清单
在动手之前,先确认你的机器满足以下条件:
| 检查项 | 要求 | 查看方式 |
|---|---|---|
| Windows 版本 | Windows 10 2004 及以上(内部版本 19041+)或 Windows 11 | winver命令 |
| 虚拟化 | BIOS 中已开启虚拟化 | 任务管理器 → 性能 → CPU → 虚拟化 |
| WSL | 已安装 WSL2 | wsl --list --verbose |
| 内存 | 建议 8G 以上 | 任务管理器 |
| 磁盘 | 非系统盘预留至少 50G | 资源管理器 |
提示:如果你的任务管理器里“虚拟化”显示为“已禁用”,需要重启进 BIOS 开启 Intel VT-x 或 AMD-V,这一步没法在系统里软开。
2. 把 WSL2 这个地基打牢,不然后面全是坑
Docker Desktop 的 WSL2 后端依赖 WSL2 本身,所以 WSL2 没装好或者版本太老,Docker 装完也起不来。这一步很多人会跳过,结果后面报一堆莫名其妙的错。
2.1 一条命令搞定 WSL 安装
在 Windows 11 或者较新的 Windows 10 上,直接用管理员权限打开 PowerShell,执行:
wsl --install这条命令会自动帮你开启“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个 Windows 功能,然后下载并安装 WSL2 内核更新包,最后还会装一个默认的 Ubuntu 发行版。执行完重启电脑即可。
如果你用的是老版本 Windows 10,可能不支持这条一键命令,那就手动来:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart两条命令执行完重启,然后去下载 WSL2 内核更新包手动安装,再执行wsl --set-default-version 2把默认版本设为 2。
2.2 验证 WSL2 是否就绪
装完之后别急着装 Docker,先验证一下:
wsl --list --verbose如果输出里能看到类似Ubuntu Running 2这样的信息,说明 WSL2 已经正常工作。如果 VERSION 那一列显示的是 1,用下面的命令转成 2:
wsl --set-version Ubuntu 22.3 WSL 虚拟磁盘的默认位置问题
这里要提前说一个关键点:WSL2 每个发行版都会生成一个ext4.vhdx虚拟磁盘文件,默认放在C:\Users\你的用户名\AppData\Local\Packages\下面那一长串带随机字符的目录里。这个文件会随着你使用不断膨胀,而且 WSL 的虚拟磁盘有个特点——它只增不减,你删了文件它也不会自动缩小。所以如果你打算长期用 Docker,最好从一开始就把 WSL 发行版装到非系统盘,或者装完之后迁移过去。
迁移的方法在下一节详细讲,这里先记住这个事。
3. 安装 Docker Desktop 并把它请出 C 盘
终于到正题了。Docker Desktop 的安装本身不复杂,复杂的是怎么把它的数据目录挪走。
3.1 下载与安装
去 Docker 官网下载 Docker Desktop for Windows 的安装包。国内下载速度可能比较慢,如果实在下不动,可以找一些国内镜像站点的安装包,但要注意校验文件完整性,别装到来路不明的版本。
下载完双击安装,安装向导里有一个选项叫“Use WSL 2 instead of Hyper-V”,确保勾上。安装完成后不要立即启动,先做下面的路径迁移。
3.2 修改 Docker Desktop 磁盘镜像位置
Docker Desktop 从 4.x 版本开始,在设置里直接提供了修改磁盘镜像位置的选项。打开 Docker Desktop,进入Settings → Resources → Advanced,你会看到一个Disk image location的路径,默认是:
C:\Users\你的用户名\AppData\Local\Docker\wsl点右边的 Browse 按钮,选一个非系统盘的目标目录,比如D:\Docker\data。选好之后点 Apply & Restart,Docker 会自动把现有的数据迁移过去。这个过程可能需要几分钟,取决于你已有的镜像和容器数量。
注意:迁移过程中不要强制关闭 Docker Desktop,否则可能导致数据损坏。如果数据量很大,建议先清理掉不用的镜像和容器再迁移。
3.3 手动迁移 WSL 发行版的完整流程
如果你想把docker-desktop和docker-desktop-data这两个 WSL 发行版也挪到非系统盘,或者你用的是旧版 Docker Desktop 没有图形化迁移选项,那就得手动操作。步骤如下:
先关闭 Docker Desktop,然后在 PowerShell 里执行:
wsl --shutdown确认所有 WSL 实例都停了之后,导出两个发行版:
wsl --export docker-desktop D:\wsl-backup\docker-desktop.tar wsl --export docker-desktop-data D:\wsl-backup\docker-desktop-data.tar导出完成后注销原来的发行版:
wsl --unregister docker-desktop wsl --unregister docker-desktop-data然后从备份文件重新导入到新位置:
wsl --import docker-desktop D:\Docker\wsl\docker-desktop D:\wsl-backup\docker-desktop.tar --version 2 wsl --import docker-desktop-data D:\Docker\wsl\docker-desktop-data D:\wsl-backup\docker-desktop-data.tar --version 2导入完成后重新启动 Docker Desktop,它会自动识别新的发行版位置。这时候你再去 C 盘看,原来的目录应该已经空了。
3.4 迁移后必做的验证
迁移完别以为就完事了,一定要验证:
docker info看输出里的Docker Root Dir是不是指向了新的位置。再随便跑一个容器测试:
docker run --rm hello-world如果能正常输出,说明迁移成功。另外去新目录下看看ext4.vhdx文件是不是在那里,文件大小是否在增长。
4. 镜像源配置:不配这个基本没法用
Docker 装好了,路径也改好了,但如果你直接docker pull一个镜像,大概率会卡在那里半天不动,最后超时。这不是你的问题,是国内网络环境的问题。解决办法就是配置国内镜像源。
4.1 Docker Desktop 图形化配置镜像源
打开 Docker Desktop,进入Settings → Docker Engine,你会看到一个 JSON 配置文件。在里面加上registry-mirrors字段:
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }改完点 Apply & Restart。这里要注意 JSON 格式必须正确,多一个逗号少一个引号都会导致 Docker 起不来。
4.2 镜像源的选择与测速
国内可用的镜像源不少,但质量参差不齐,而且有些会时不时挂掉。我一般会准备三到四个,按顺序配置,Docker 会依次尝试。常用的有:
| 镜像源 | 地址 | 特点 |
|---|---|---|
| 中科大 | https://docker.mirrors.ustc.edu.cn | 稳定,更新及时 |
| 网易 | https://hub-mirror.c.163.com | 老牌,速度尚可 |
| 百度云 | https://mirror.baidubce.com | 速度不错 |
| 阿里云 | https://你的ID.mirror.aliyuncs.com | 需要登录阿里云获取专属地址 |
阿里云的镜像源需要你登录阿里云容器镜像服务控制台,在“镜像加速器”页面获取一个专属地址,这个地址是带你的账号 ID 的,速度通常比公共镜像源更快更稳定。
4.3 配置完镜像源还是拉不动怎么办
有时候镜像源配了,但拉取特定镜像还是失败。这种情况通常是那个镜像在镜像源里没有缓存。解决办法有两个:一是换一个镜像源试试,二是直接用镜像的完整地址从其他仓库拉。比如有些镜像在 Docker Hub 上没有,但在 GitHub Container Registry 上有,那就用ghcr.io/xxx/yyy这样的完整路径拉。
还有一个技巧是配置insecure-registries,如果你有内网私有仓库且没配 HTTPS 证书,需要在这里加上地址,否则 Docker 会拒绝连接。
5. 那些装完才发现的坑和对应的解法
前面讲的都是顺利情况下的流程,但实际操作中总会遇到各种意外。这一节把我遇到过的问题和解决办法列出来,你遇到了可以直接对照。
5.1 Docker Desktop 启动报“Virtualization support not detected”
这个错误出现的原因通常是 BIOS 里虚拟化没开,或者开了但被其他软件占用了。先确认任务管理器里虚拟化是“已启用”。如果已启用还报这个错,检查是不是装了 VMware 或者 VirtualBox,它们可能和 WSL2 冲突。解决办法是关掉那些软件的虚拟化加速功能,或者干脆卸载。
还有一种情况是 Windows 的“虚拟机平台”功能没开。用管理员 PowerShell 执行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启。
5.2 WSL2 虚拟磁盘越用越大,怎么瘦身
前面说过 WSL 的虚拟磁盘只增不减。如果你删了很多镜像和容器,但ext4.vhdx文件还是那么大,可以手动压缩。先关闭 Docker 和 WSL:
wsl --shutdown然后用 diskpart 工具压缩:
diskpart select vdisk file="D:\Docker\wsl\docker-desktop-data\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit压缩完成后重新启动 Docker,磁盘文件应该会小很多。这个操作我建议每隔一两个月做一次,尤其是经常拉取和删除大镜像的用户。
5.3 在 WSL 里直接用 Docker 命令
装完 Docker Desktop 后,你可以在 WSL 的 Ubuntu 里直接使用docker命令,因为 Docker Desktop 会自动把 Docker CLI 注入到 WSL 发行版里。但有时候你会发现 WSL 里docker命令找不到,这是因为 Docker Desktop 的 WSL 集成没开启。去Settings → Resources → WSL Integration,把你用的发行版开关打开即可。
5.4 镜像拉取超时的排查顺序
遇到拉取超时,按这个顺序排查:
- 先确认镜像源配置是否生效:
docker info看Registry Mirrors那一行 - 用
curl测试镜像源地址是否可达 - 换一个镜像源再试
- 检查是不是镜像名写错了,比如把
nginx写成了ngnix - 如果是私有仓库,确认网络能通且认证信息正确
5.5 Docker Desktop 更新后配置丢失
Docker Desktop 每次大版本更新后,有时候会重置 Docker Engine 的配置文件,导致你之前配的镜像源没了。所以每次更新完,第一件事就是去 Settings 里检查一下镜像源还在不在。我一般会把配置文件备份一份,丢了直接粘贴回去。
6. 装完之后值得做的几项调优
Docker 能跑起来只是第一步,让它跑得舒服还需要做一些调整。
6.1 限制 WSL2 的内存占用
WSL2 默认会占用最多你系统一半的内存,如果你机器内存不大,Docker 一跑起来可能整个系统都卡。可以在用户目录下创建一个.wslconfig文件来限制:
[wsl2] memory=4GB processors=2 swap=2GB这个文件放在C:\Users\你的用户名\.wslconfig,改完执行wsl --shutdown重启 WSL 生效。内存给多少取决于你的总内存,一般 8G 内存的机器给 4G,16G 的给 6-8G 比较合适。
6.2 配置国内 npm、pip 等镜像源
如果你在容器里或者 WSL 里经常用 npm、pip,也可以顺手把它们的镜像源配了。npm 的:
npm config set registry https://registry.npmmirror.compip 的:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这些配置在构建镜像的时候特别有用,能显著加快依赖安装速度。
6.3 定期清理无用资源
Docker 用久了会积累大量无用镜像、停止的容器、悬空卷和构建缓存。定期执行下面的命令清理:
docker system prune -a --volumes这个命令会删除所有未使用的镜像、容器、网络和卷。执行前确认没有你需要保留的东西。如果想更精细地清理,可以分开执行docker image prune、docker container prune、docker volume prune。
注意:
docker system prune -a会删除所有没有被运行中容器使用的镜像,包括你手动拉取的但暂时没用的镜像。执行前想清楚。
6.4 把常用操作做成脚本
如果你经常需要重建环境,可以把安装和配置过程写成一个 PowerShell 脚本,下次换机器直接跑一遍。脚本里包括开启 WSL 功能、安装 WSL2、导入发行版到指定目录、配置镜像源这些步骤。这样能省下大量重复劳动。
7. 关于路径修改这件事,再多说几句
修改 Docker 默认安装路径这件事,表面上看只是改个目录,但背后涉及 WSL 发行版的导入导出、虚拟磁盘的迁移、Docker Desktop 配置的更新这几个环节,任何一个环节出问题都可能导致 Docker 起不来或者数据丢失。
我的建议是,如果你是新装 Docker,最好在第一次启动 Docker Desktop 之前就把 WSL 发行版的位置规划好。因为这时候还没有数据,迁移成本最低。具体做法是先用wsl --install装好 WSL2,然后手动导入docker-desktop和docker-desktop-data到目标盘,再安装 Docker Desktop。这样 Docker Desktop 第一次启动时就会直接使用你指定位置的发行版。
如果你已经用了一段时间,数据比较多,迁移前一定要先备份。导出的 tar 文件就是最好的备份,万一导入失败还能用备份恢复。迁移过程中保持耐心,不要中途强制关机。
另外要提醒的是,不同版本的 Docker Desktop 在路径设置上的界面和选项位置可能略有不同,但核心逻辑是一样的——找到磁盘镜像位置设置,改到非系统盘。如果图形界面找不到,就用手动导入导出的方式,这个方法是通用的,不依赖具体版本。
最后说一个我自己的习惯:我会把 Docker 的数据目录、WSL 备份文件、配置文件都放在同一个盘的不同文件夹里,结构清晰,方便管理和备份。比如D:\Docker\data放数据,D:\Docker\backup放备份,D:\Docker\config放配置文件。这样哪天要迁移或者重装,直接整个D:\Docker目录打包带走就行。