说个我踩了两年的坑。Docker Desktop 和 VMware Workstation 在 Win10 上以前就是一对冤家——Docker 要开 Hyper-V,VMware 一见到 Hyper-V 就没法启动虚拟机。那时候想在两边兼顾,只能用引导切换的办法,改一次 bcdedit 重启一次,白天用 Docker 联调服务、晚上开 VMware 测虚拟机,一整天下来有大半精力都耗在开机等圈圈上。直到我把 Docker Desktop 切到 WSL2 后端,再配合新版 VMware 对 Windows Hypervisor Platform 的兼容支持,才终于把这台电脑从"重启地狱"里捞了出来。这篇文章就是把整套思路和操作细节完整记一遍,适合在 Win10 上同时需要 Docker 和 VMware、又不想反复切换引导的人参考,也适合刚准备入 WSL2 的朋友当一份安装手册。
1. 先搞清楚为什么以前必须重启
1.1 这对"冤家"的恩怨情仇
Docker Desktop 早期在 Windows 上是个彻头彻尾的"Hyper-V 依赖户"。它靠 Hyper-V 拉一个独立的 Linux 虚拟机(MobyVM)来跑容器,所以你只要想在 Windows 上正常使用 Docker,就必须先把 Hyper-V 打开。VMware Workstation 这边恰好相反——它自带一套和 Hyper-V 同级的虚拟化引擎,之前的版本一旦检测到 Windows 的 Hypervisor 已经占用了 CPU 虚拟化层,就直接罢工,报"VMware Workstation 和 Hyper-V 不兼容,请禁用 Hyper-V"之类的错误。
于是那几年大家只能玩"引导切换"。手动以管理员身份打开 CMD,用两条命令来回倒:
bcdedit /set hypervisorlaunchtype auto ' 切到 Hyper-V,给 Docker 用 bcdedit /set hypervisorlaunchtype off ' 关掉 Hyper-V,给 VMware 用切完还得重启,每次开机等半天圈圈。更难受的是,实际开发场景里"容器加虚拟机"经常要同时上:容器里起一个 API 服务,VMware 里跑一个要对接的客户端程序或者旧系统镜像,两边还得互相通信。这时候你只能二选一,来回切来切去,时间全浪费在等待上。说它是"重启烦恼",一点不夸张。
1.2 新版VMware其实已经变了
转折点出现在 2020 年前后。VMware Workstation 从 15.5 版本开始,官方支持在启用 Hyper-V 的 Windows 主机上运行虚拟机,早期版本算技术预览,到了 15.5.2 基本可用,16、17 已经非常成熟。原理上,VMware 不再坚持自己直接控制 CPU 虚拟化层,而是通过 Windows 提供的一组 API 接口,跑在 Hypervisor 之上。
但问题在于,很多网上教程还停留在老黄历,一开口就让你"关 Hyper-V""禁用 Device Guard"。我查过不少社区帖,不少人明明用的是 VMware 16、17,还在照着老方法关来关去。真正需要做的是三件事:把系统的虚拟化相关功能打开、让 Docker 走 WSL2 后端、装一个新版 VMware。下面把这套逻辑彻底讲清楚。
2. 共存方案的底层原理:三个组件各干各的活
2.1 Hyper-V、虚拟机平台、WHP到底指什么
很多人一听到"虚拟化"就头大,其实在 Windows 上这几个功能名字看着像,各自干的活完全不同:
| Windows 功能 | 作用 | 对我们方案的意义 |
|---|---|---|
| Hyper-V 完整角色 | 提供完整的 Hyper-V 管理器、虚拟交换机等,功能最全 | 不需要特意开启,装了反而多占资源 |
| 虚拟机平台(VirtualMachinePlatform) | WSL2 运行轻量级虚拟机的基础,包含底层 Hypervisor | 必须开启 |
| Windows 虚拟机监控程序平台(HypervisorPlatform) | 向 VMware、VirtualBox 等第三方软件开放 Hypervisor API | 必须开启 |
你可以把 Hypervisor 想象成一栋大楼的地基。WSL2 是其中一个租户,它通过"虚拟机平台"这扇门住进来;VMware 是另一个租户,它想住进来就得走"Windows 虚拟机监控程序平台"这道公共通道。三者共用同一个地基,谁也不需要把谁赶走。
2.2 WSL2是如何"偷瞄"Windows Hypervisor的
WSL2 和第一代 WSL 最大的区别是,它不再是翻译系统调用,而是运行一个真正的 Linux 内核。这个内核跑在由"虚拟机平台"创建的轻量级虚拟机上,由 Windows 统一调度 CPU、内存和 I/O。Docker Desktop 的 WSL2 后端,就是直接复用了这套 Linux 内核来跑容器,而不是像老版本那样自己再单独创建一个 MobyVM。
这样做的好处非常明显:不再为 Docker 单独保留一整个虚拟机,内存可以动态收缩,磁盘占用也更小,启动容器几乎是秒开。同时,因为根本不需要完整的 Hyper-V 管理角色,Windows 10 家庭版也能用。很多人以为"没有 Pro 版就装不了 Docker",其实是误解,家庭版只要开启"虚拟机平台"和 WSL 相关功能就行。
2.3 为什么这个方案在Win10上也能用
微软在 Windows 10 2004(build 19041)之后,把 WSL2 正式带给了普通用户。家庭版虽然没有 Hyper-V 角色,但"虚拟机平台"和"Windows 虚拟机监控程序平台"这两个功能都在,这就够用了。Docker Desktop 在家庭版上必须选 WSL2 后端,因为 Hyper-V 后端依赖完整角色;在专业版上虽然两个后端都能选,但从资源占用和体验来看,我还是建议无脑选 WSL2。
所以这套共存方案的完整拼图是:Win10 2004 以上系统 + 开启"虚拟机平台"和"WHP" + WSL2 内核 + Docker Desktop 走 WSL2 后端 + VMware Workstation 15.5.2 以上版本。缺一个环节都可能回到老路上去。
3. 动手前先自查:版本、BIOS和Windows功能依赖
3.1 最低硬件和系统版本要求
先说结论,这台机器的硬件不需要多豪华,但有几项是硬指标。我做了个速查表:
| 项目 | 最低要求 | 建议配置 |
|---|---|---|
| CPU | 支持 VT-x / AMD-V,且已开启 | 4 核以上,6 核更稳 |
| 内存 | 8 GB | 16 GB |
| 磁盘 | 50 GB 剩余空间 | NVMe SSD |
| 系统 | Win10 64 位 2004(build 19041)以上 | 最新更新的 Win10 |
| 虚拟化 | BIOS 中开启 Virtualization Technology | 任务管理器能直接看到"已启用" |
如果你的系统版本低于 2004,建议先把 Windows Update 跑满。不是不能装,是 WSL2 在老版本上兼容性问题多,没必要给自己添堵。
3.2 确认BIOS中的CPU虚拟化开关
这块是最隐蔽的坑。你按教程把所有软件都装好了,最后发现 WSL2 启动就报"此计算机上未启用虚拟化",十有八九是 BIOS 里的开关没开。
判断方法很简单:打开任务管理器,切到"性能"标签,点 CPU,看右下角"虚拟化"状态。如果是"已启用",恭喜,跳过这步。如果是"已禁用",重启进 BIOS(开机时按 Del 或 F2,品牌机可能是 F10/F12),找 "Intel Virtualization Technology" 或 "SVM Mode",改成 Enabled,保存退出。不同主板菜单名字不一样,本质都是把 CPU 的虚拟化扩展打开。
3.3 需要开启的Windows功能(附PowerShell命令)
这一步用管理员身份打开 PowerShell 或者 CMD,一行一行执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart dism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart三条命令分别对应"适用于 Linux 的 Windows 子系统""虚拟机平台""Windows 虚拟机监控程序平台"。执行完之后提示重启就重启,不要偷懒。到这里可以把"控制面板 - 程序和功能 - 启用或关闭 Windows 功能"界面打开看一眼,确认这三项前面是勾选状态,方便后面排查问题。
注意:网上很多教程会劝你直接勾选整个"Hyper-V",我并不建议。我们的方案只需要上面三个平台组件,把完整 Hyper-V 角色也打开不仅没必要,还会让系统多出一堆服务,反而给后续排查增加干扰。
4. 装WSL2:环境搭好了后面才顺
4.1 安装WSL2内核与设置默认版本
Windows 功能开完之后,还不能直接装发行版,因为 WSL2 的 Linux 内核是单独分发的。去微软官网下载 "WSL2 Linux 内核更新包"(搜索 wsl_update_x64.msi,官方链接一般挂在 aka.ms/wsl2kernel 下),下载后双击安装。
安装完内核,在管理员 CMD 里执行:
wsl --set-default-version 2这一步是告诉 Windows,以后新装的 Linux 发行版默认使用 WSL2 架构。如果你在这里看到"WSL 2 需要更新其内核组件"之类的提示,多半是内核 msi 没装或者装完没生效,重新跑一遍安装程序再试。
4.2 安装Ubuntu 22.04并验证
WSL2 本身只是平台,你需要一个真实的 Linux 发行版作为 Docker 的运行环境。最简单的方式是从 Microsoft Store 搜索 Ubuntu 22.04.3 LTS,点安装。也可以在 CMD 里执行:
wsl --install -d Ubuntu-22.04首次启动会让你设置 Linux 用户名和密码,这个用户名的权限规则和普通 Linux 一样,把它当 sudo 用户用就行。安装完执行:
wsl -l -v如果看到 Ubuntu-22.04 的 VERSION 列是 2,说明 WSL2 架构已经生效。如果显示 1,执行wsl --set-version Ubuntu-22.04 2手动转换。
顺便把系统更新跑一下,后面 Docker 装依赖会快很多:
sudo apt update && sudo apt upgrade -y4.3 给WSL2画一条资源红线(.wslconfig)
WSL2 默认会按比例吃内存,默认策略是取总内存的一半或者 8GB 中较小的那个(不同版本策略略有差异)。如果电脑本身只有 16GB 内存,再同时开 VMware 和 Docker,很容易卡到鼠标都漂移。我的经验是在用户目录下建一个.wslconfig文件(路径一般是C:\Users\你的用户名\.wslconfig),写上:
[wsl2] memory=4GB processors=4 swap=2GB localhostForwarding=true修改完执行wsl --shutdown让配置生效。这样 WSL2 最多只用 4GB 内存,剩下的空间留给 VMware 和 Windows 自己,三者之间就不会互相抢资源。
5. 装Docker Desktop,并把引擎切到WSL2后端
5.1 安装时的选项别选错
Docker Desktop 的安装包可以直接从官网下载稳定版。安装过程中有一个关键页面会问 "Use WSL 2 instead of Hyper-V",一定要勾选。现在的安装器一般会自动检测你系统里已经装了 WSL2,然后默认就勾上,但如果你是从老版本升级上来的,容易踩坑。
已经装过 Docker Desktop 的也没关系,打开 Settings - General,把 "Use the WSL 2 based engine" 勾上,然后点 Apply & Restart。这一步就是整个共存方案的灵魂:Docker 从此不再依赖独立的 MobyVM,而是直接跑在 WSL2 的 Linux 内核上,资源的开销小了一大截。
5.2 打开与Ubuntu的集成
Docker Desktop 装好后,默认只在它自己创建的docker-desktop发行版里跑引擎,但你平时操作更习惯在自己的 Ubuntu 终端里执行 docker 命令。需要手动打开集成:Settings - Resources - WSL Integration,在列表里把你安装的 Ubuntu-22.04 打开。
打开之后,回到 Ubuntu 终端执行docker --version,如果能看到版本号而不是 "command not found",说明集成成功。这一步经常会遇到明明已经打开集成,但容器里还是找不到 docker,一般重启 Docker Desktop 或者wsl --shutdown之后就能解决。
5.3 跑通第一个容器验证环境
验证整个链路是否通畅,最好的方法就是跑一个最小的测试容器。在 Ubuntu 终端里执行:
docker run hello-world正常情况下,Docker 会从镜像仓库拉取 hello-world 镜像,然后运行并打印一段说明文字。如果这一步顺利通过,说明 WSL2、Docker Desktop、Ubuntu 三者之间的通道已经完全打通。再执行一下docker ps -a,能看到刚才那个已经退出的 hello-world 容器,环境就确认没白配。
顺嘴提一句,日常使用中所有 docker 命令我都是在 Ubuntu 终端里敲,基本不碰 PowerShell 里的 docker.exe。前者走的是 Linux 原生环境,文件系统、路径风格都正常,后者在 Windows 和 Linux 的边界上容易产生路径类型、换行符之类的诡异问题,新手尤其容易在这些小事上栽跟头。
6. 装VMware Workstation,并让它和Docker同时跑
6.1 版本选择:15.5.2只是起点,17.x才是常态
到了最关键的一步。VMware Workstation 的版本必须满足条件:最低 15.5.2,推荐 16.x 或 17.x。15.5.2 是能和 Hyper-V 共存的首个稳定版本,但性能和稳定性都一般,我实测下来有几个旧镜像在 15.5 上经常出现鼠标卡顿,升到 17 之后就再没见过类似问题。
这里额外说一句,VMware 被收购之后,官方已经把 Workstation Pro 改为个人使用免费的政策。你只需要到官网注册一个账号,就能拿到个人使用的许可证,完全不需要去网上找什么乱七八糟的序列号。免费、干净、更新及时,怎么选已经很清楚了。
6.2 让VMware走WHP模式的关键点
安装 VMware 的过程本身没什么特殊操作,一路 Next 就行。真正需要注意的,是启动第一台虚拟机时系统会不会报错。
如果你之前为了老版本 VMware 做过"关闭 Hyper-V"的引导操作,现在必须把它改回来。在管理员 CMD 里执行:
bcdedit /set hypervisorlaunchtype auto然后重启。因为 WSL2 和 WHP 都需要 Hypervisor 正常启动,这个开关必须保持 auto。
启动虚拟机后,如果一切正常,VMware 会静默地通过 WHP 接口运行,你甚至感觉不到它和 Docker 在共享同一个虚拟化底座。但要注意,WHP 模式下 VMware 有部分功能是受限的,比如对 32 位老旧客户机系统、某些需要硬件直通的特殊设备的支持不如原生态模式。绝大多数人日常跑 64 位的 Windows、Linux 虚拟机完全没问题,但如果你专门做内核调试、硬件模拟这类偏门实验,就得权衡一下了。
6.3 同时运行的资源分配经验
Docker 和 VMware 都装好之后,最关键的就是资源分配。我自己的方案是:16GB 内存的笔记本,WSL2 限 4GB,VMware 里给主要的虚拟机分配 4GB,Windows 系统和各种开发工具留 8GB。这样三边都有余量,平时开着 Docker Desktop 和一台 VMware 虚拟机,再挂两三个 IDE,基本不卡。
另一个建议是文件位置。Docker 相关的数据和项目尽量放在 WSL2 的 Linux 文件系统里,也就是 Ubuntu 家目录/home/用户名/,不要放/mnt/c/下。WSL2 访问 Windows 盘符挂载目录时,走的是跨文件系统协议,性能损失很大;项目代码放 Linux 侧,容器挂载和构建速度都能感到明显提升。VMware 的虚拟机磁盘文件则放 SSD 上,内存足够大的话可以把虚拟机内存调大一点,减少磁盘换入换出。
7. 常见问题与排查技巧实录(附速查表)
7.1 Docker Desktop把"锅"甩给虚拟化的几种表现
最常见的是启动时弹窗 "Docker Desktop failed to start because virtualisation support wasn't detected"。这个提示很坑,因为它其实掩盖了三种不同的原因:
| 现象 | 主要原因 | 解决方案 |
|---|---|---|
| 提示未检测到虚拟化支持 | BIOS 中 VT-x/SVM 未开启 | 进 BIOS 开启虚拟化 |
| 提示需要开启虚拟机平台 | Windows 功能没启用 | 重跑 dism 命令启用 VirtualMachinePlatform |
| 提示需要 WSL2 内核更新 | wsl_update_x64.msi 没装或失效 | 重新安装内核更新包 |
我每次重装系统后都是按这个顺序排查,基本一两分钟就能定位。还有一个隐藏点:如果你装过某些"系统优化工具"把 Hyper-V 相关的服务禁用了,也会出现这个弹窗,检查一下服务管理器里VMms(Hyper-V 虚拟机管理服务)有没有被设为禁用。
7.2 WSL2无法启动的经典报错
报错信息一般是:WSL2 无法启动,因为此计算机上未启用虚拟化。请确保计算机固件设置中"虚拟机平台"已启用,并且虚拟化已在 BIOS 中启用。看到这行字先别急着重装,按优先级检查三件事。
第一,任务管理器确认虚拟化状态是不是"已启用";第二,Windows 功能里确认"虚拟机平台"是勾选状态;第三,执行bcdedit /enum | findstr hypervisorlaunchtype,确认结果是Auto,如果显示Off,执行bcdedit /set hypervisorlaunchtype auto重启。这三个地方都正常之后,WSL2 基本不会再有启动类问题。
另一个常见错误是WslRegisterDistribution failed with error: 0x80370102,根因同样是虚拟化层没起来,按上面三步排查即可。
7.3 VMware与Device/Credential Guard的兼容地雷
开始就用共存方案的人不多,所以很多人不知道这里还藏着一个地雷:Windows 的"基于虚拟化的安全"(VBS)和内核隔离没关的情况下,VMware 可能启动虚拟机时直接报"VMware Workstation 与 Device/Credential Guard 不兼容"。
解决步骤是这样的:打开 Windows 安全中心 - 设备安全性 - 内核隔离,把"内存完整性"开关关掉,重启。如果重启后问题还在,再检查msinfo32里的"基于虚拟化的安全"是否还在运行,是的话就需要通过本地组策略把 Device Guard 关掉:gpedit.msc,计算机配置 - 管理模板 - 系统 - Device Guard - 打开基于虚拟化的安全,设为"已禁用"。
注意:这里关闭的是内存完整性这一项虚拟化安全功能,不是让你关闭 Windows Defender 的实时防护和防火墙。杀毒软件和系统更新该开还是开,只是这个功能与 VMware 的虚拟化模块存在兼容冲突,平时没有特殊安全需求的话关掉不影响日常使用。
7.4 我的日常资源分配和顺序习惯
文章最后分享几个我自己长期使用下来的习惯。第一个,开机之后先启动 Docker Desktop,等右下角图标变稳定后再开 VMware 虚拟机,顺序反过来的话偶尔会遇到 VMware 抢内存导致 Docker 引擎初始化失败。第二个,把频繁用的容器编排写成 docker-compose.yml,需要时一条docker compose up -d拉起来,用完down清理,尽量避免让容器长期占着资源。第三个,每隔一段时间执行一次wsl --shutdown,把 WSL2 的缓存清一清,特别是 Windows 大版本更新之后,很多莫名其妙的网络和性能问题都会在这条命令后消失。
最后再给个实在的建议:装这套环境的时候不要图快一口气把所有组件都装上。按"Windows 功能 - WSL2 内核 - Ubuntu - Docker Desktop - VMware"的顺序,每装完一个就验证一个,出现问题能立刻定位到具体环节。这套流程我前前后后帮周围同事处理过不下十次,按这个顺序走,两个小时以内基本都能跑通,之后就再也不用在 Windows 里为了"二选一"烦恼了。