资讯动态

Win10 v2004下用WSL2部署Docker的完整指南

发布时间:2026/10/14 5:42:24 来源:尧图企业网站定制
想在 win10 v2004 上老老实实跑 Docker先劝你一句别碰老掉牙的 Docker Toolbox也别一上来就开整套 Hyper-V。WSL2 出来之后最舒服的路径就是把系统虚拟化打开装一个 WSL2再让 Docker Desktop 跑在 WSL2 后端上。这篇文章是给准备在 win10 v2004 环境里部署 Docker 的人写的我会把这套流程从 BIOS 检查、系统功能开启、内核更新、发行版安装到最后 Docker 配置的每一步都拆开讲顺带把容易翻车的点标记出来。无论你只是想在本地跑个 Nginx 调试页面还是想搭一套完整的开发环境顺着这套流程走基本半小时内能见到docker run hello-world的输出。1. 先想清楚为什么 Docker 要配 WSL2而不是其他方案1.1 Windows 上跑 Docker 的几条老路在 WSL2 成熟之前Windows 上跑 Docker 基本只有两条路可走。一条是 Docker Toolbox底层靠 VirtualBox 起一个完整的 Linux 虚拟机所有容器都在这个虚拟机里跑。它的缺点是启动慢、占用大、磁盘 IO 差得要命而且 VirtualBox 的网络、端口映射配置隔三差五出问题。我当年用它跑一次docker-compose up都要等两分钟日志文件一大整个 IDE 都跟着卡。只适合实在没有别的选择时临时用一下不适合日常开发。另一条是 Docker Desktop 配 Hyper-V。这条路本身没什么硬伤容器引擎是直接跑在 Hyper-V 的轻量虚拟机里的性能和稳定性都比 VirtualBox 方案好很多。但问题在于一旦开启 Hyper-V电脑上其他依赖 VirtualBox 或 VMware 的软件就会受到牵连。比如 Android 模拟器、一些老牌的虚拟机工具轻则启动报错重则直接蓝屏。而且完整 Hyper-V 的服务、内存占用都不小对普通笔记本并不友好。WSL2 这条方案解决的就是这个平衡问题。它同样走轻量虚拟化底层基于 Hyper-V 架构但不会让整个系统进入完整 Hyper-V模式普通用户几乎感知不到虚拟化层的存在。Docker Desktop 检测到 WSL2 后会在 WSL2 环境里额外起一个极简发行版专门承载 Docker 引擎Windows 这边的命令直接通过 socket 转发过去体验非常接近原生 Linux。这也是我现在唯一推荐给身边人的方案。1.2 WSL2 相比 WSL1 的关键变化很多人容易把 WSL1 和 WSL2 混为一谈但它们其实是完全不同的两个东西。WSL1 做的是系统调用翻译把 Linux 的 syscall 在 Windows 内核里逐个解释执行好处是不需要虚拟化硬件支持启动快但坏处也在这不是所有系统调用都能完整翻译遇到 Docker daemon 这种要创建网络命名空间、挂载 cgroups、控制 iptables 的重型组件WSL1 根本扛不住。所以早期想在 WSL1 里跑 Docker要么各种 hack要么直接劝退。WSL2 不一样它自带一个真正的 Linux 内核跑在一个轻量的虚拟机里。Linux 自己的系统调用、文件系统、网络栈都是原装不需要翻译。这意味着 Docker daemon 可以完整跑起来也意味着 ext4 文件系统的读写性能接近原生。对容器技术来说这是一个质的跨越。但代价也很明确WSL2 需要 CPU 虚拟化支持。也就是说BIOS 里的 VT-xIntel或 SVMAMD必须打开否则 WSL2 起不来。这也是为什么后面第二章要把 BIOS 检查放在最前面这一步没做对后面所有命令都是白敲。1.3 哪些场景适合这套方案先说结论个人开发者、前端/后端联调、本地学习 Linux 容器、搭博客环境、做 CI 配置的本地预演都适合用 WSL2 后端跑 Docker。尤其是那种想用 Docker 但不想迁到纯 Linux 笔记本的场景这套方案几乎是最优解。不太适合的场景也有需要容器固定 IP、需要走桥接网络让局域网设备直接访问容器、需要跑 Kubernetes 完整集群控制面这些重型玩法WSL2 的 NAT 网络会带来额外麻烦。不是不能做但你需要额外配置端口转发甚至虚拟网卡维护成本高不少。还有一个认知点要提前建立开启 WSL2 集成后Docker 引擎并不是跑在你装的 Ubuntu 发行版里。Docker Desktop 会自己创建docker-desktop和docker-desktop-data两个专用发行版你的 Ubuntu 只是被注入了一套客户端工具任何docker run都会被转发给专用发行版里的引擎。很多人第一次看到wsl --list里多了两个名字就很慌其实这是正常现象。2. 动手前先花十分钟做三项检查2.1 确认系统版本足够新WSL2 虽然从 1903 开始就能通过绕过限制的方式启用但真正体面地支持它还是 win10 v2004内部版本号 19041以及之后。如果你的系统还没到这个版本号建议先更新系统不要想着跳过这一步。检查方法很简单按Win R输入winver回车弹出来的窗口里会显示版本和内部版本号。看到版本 2004或者内部版本号大于等于 19041就可以继续。如果版本号偏低先去 Windows 更新里把补丁打满再回来看这里。这一步看似基础但真的有人在这卡住。我遇到过朋友直接在那台永远不更新的电脑上敲命令结果怎么折腾都报错最后一看系统还停在 1809连 WSL2 内核更新包都没法正常装。版本不对后面所有报错都看不懂白白浪费一晚上。2.2 确认 CPU 虚拟化开关WSL2 的轻量虚拟机需要 CPU 虚拟化指令这个功能在 BIOS 里默认可能是关闭的。打开任务管理器Ctrl Shift Esc切到性能标签选中左侧的 CPU看右下角有一项虚拟化。如果显示已启用说明 BIOS 层面的开关是打开的。如果显示已禁用或者干脆没有这一项就需要重启进 BIOS 去开。BIOS 里的叫法五花八门Intel 平台常见的是 Intel Virtualization Technology、VT-xAMD 平台常见的是 SVM Mode。不同主板把选项藏在的位置也不一样有的在 Advanced有的在 Security有的在 Overclocking找的时候要有耐心。开启后保存退出回到 Windows 再看一眼任务管理器确认再继续动软件层面的东西。还有一个细节如果你在 Windows 功能列表里发现Hyper-V没勾选但虚拟化仍然显示已启用这是正常的。现代 Windows 的设备防护、核心隔离这些安全功能也可能占用虚拟化能力不影响 WSL2 使用。2.3 磁盘空间和存放位置WSL2 里的每个 Linux 发行版都会在 Windows 侧生成一个 vhdx 虚拟磁盘文件默认放在 C 盘。Ubuntu 基础系统不算大但 Docker 镜像、容器数据、构建缓存加起来很容易冲上 10~20G。开始之前先确认你的 C 盘剩余空间够用。我见过最尴尬的情况是环境全装好了跑了几天之后才发现 C 盘红了。WSL2 的 vhdx 文件不像普通文件你删了发行版里的文件虚拟磁盘本身并不会自动缩水空间依然被占着。所以除非你有把握管理这些文件否则一开始就保证至少 15~20G 的余量。如果 C 盘确实紧张建议别急着入坑先清理磁盘或者把部分数据迁到其他盘再操作。不要指望系统会自动把 vhdx 放到 D 盘默认路径就是 C 盘。后期迁移不是不行但涉及虚拟机的移除和导入对新手来说完全没必要增加这个负担。3. 照着敲就能跑通的 WSL2 开启过程3.1 用管理员权限执行两条命令开启 WSL2 只需要启用两个 Windows 功能一个是适用于 Linux 的 Windows 子系统另一个是虚拟机平台。按Win键输入 PowerShell右键选择以管理员身份运行。然后依次执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一条打开 WSL 本体第二条打开 WSL2 依赖的虚拟化平台。如果你更喜欢用 Windows PowerShell 的原生命令也可以等价写Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -All Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All两条命令执行完大概率会提示需要重启系统。别拖着重启完再继续否则后面wsl --set-default-version 2会直接报错报错内容还特别容易误导人。3.2 装 WSL2 内核更新包重启之后还差一个关键组件WSL2 的 Linux 内核更新包。这个包是官方单独发布的一个小安装程序下载下来双击装完就行整个过程没什么交互。包名一般形如wsl_update_x64.msi注意选对系统架构现代 PC 基本都是 64 位。这一步特别容易漏掉。漏掉之后执行wsl --set-default-version 2时不会给一个明确的你缺内核包的提示而是会冒出一些晦涩的失败信息让你误以为是虚拟化没开或者功能没启用。装完内核更新包最好确认一下系统没有未完成的更新有的话一并装完再重启一次。这套环境就是吃版本完整性任何一处版本滞后都可能变成后面排查很久的玄学问题。3.3 把 WSL 默认版本设为 2现在打开一个新的 PowerShell 窗口执行wsl --set-default-version 2看到操作成功完成的提示说明系统已经准备好在默认情况下使用 WSL2 创建发行版了。这一步的作用是设置全局默认值意味着之后你从应用商店安装的任何 Linux 发行版都会直接以 WSL2 的形态运行而不是老旧的 WSL1。如果你之前已经装过发行版稍后用wsl --set-version单独切换即可。如果报错先回到第二章检查虚拟化是否启用再看内核更新包是否安装。一般来说缺内核包的概率比缺虚拟化更高。3.4 安装 Linux 发行版并确认版本打开Windows 应用商店搜索 Ubuntu安装一个常用的 LTS 版本比如 Ubuntu 20.04。安装后第一次启动会进入 Linux 终端按提示创建用户名和密码这个密码是 Linux 系统内部的密码跟 Windows 登录密码无关建议设置但也要记得住。如果你是在设置默认版本之前就装好了发行版或者商店安装后默认落在 WSL1执行一条转换命令wsl --set-version Ubuntu 2转换过程会提示正在进行转换这个操作需要一些时间因为它要生成新的 vhdx 文件。完成后用下面这条命令确认所有发行版的运行模式wsl --list --verbose输出里的 VERSION 列Ubuntu 对应的是 2就说明 WSL2 已经生效。如果这一列表格里以后多出了 docker-desktop 和 docker-desktop-data那是 Docker Desktop 创建的属于正常现象。4. 安装 Docker Desktop 并让引擎跑在 WSL2 上4.1 下载安装 Docker DesktopWSL2 就绪后去 Docker 官方下载页面拿 Docker Desktop for Windows 安装包。注意选择稳定版预览版虽然新功能多但稳定性还是差点日常开发没必要当小白鼠。安装过程基本一路下一步装完后它会要求注销或重启别跳过。如果你系统里之前装过老版本的 Docker Desktop 或者 Docker Toolbox建议先卸载干净再装新的。旧版本残留的配置文件、环境变量和服务项都会干扰新版本的启动最典型的症状就是引擎一直起不来。安装路径保持默认就行不要放到带中文的路径里。Docker Desktop 的组件涉及不少系统级目录和 PATH 配置中文路径会触发一些莫名其妙的权限问题。4.2 关键的 Use the WSL 2 based engine 开关第一次启动 Docker Desktop会看到欢迎界面和设置界面。进入 Settings - General找到 Use the WSL 2 based engine 这个选项勾选上。这个开关就是整个方案的核心。选它之后Docker Desktop 不再尝试启动完整 Hyper-V 虚拟机而是在 WSL2 里创建专门的发行版来承载引擎资源开销小很多启动速度也快很多。如果设置界面里找不到这个选项先别慌多半是你下载的 Docker Desktop 版本太老去官网下载最新版覆盖安装即可。选完之后 Docker Desktop 会提示需要重启照做。重启后可以在 PowerShell 里执行wsl --list --verbose看一眼这时应该能看到 docker-desktop 和 docker-desktop-data 两个发行版说明引擎已经成功跑在 WSL2 环境里了。看到这两个名字不意味着出错这是我前面强调过的正常现象。4.3 将 Ubuntu 发行版接入 DockerDocker 引擎跑起来了但你肯定更希望在 Ubuntu 终端里直接用docker命令而不是每次都切到 PowerShell。进入 Settings - Resources - WSL Integration找到 Enable Docker integration with my default WSL distro勾选它同时勾选你安装的 Ubuntu 发行版。保存后重启 Docker Desktop。重启完打开 Ubuntu 终端输入docker --version如果能看到 Docker 客户端版本信息说明集成成功。这时候执行docker run hello-world也可以直接用了引擎是同一个只是操作入口变了。如果命令找不到先检查 Docker Desktop 是否还在运行然后关掉 Ubuntu 终端重开。集成配置只在终端启动时加载不重开终端不会生效。还不行就把 Docker Desktop 完全退出再启动多半就好。4.4 顺手配一个镜像加速Docker Hub 镜像拉取速度在国内环境时快时慢配置镜像加速是能显著改善体验的一步。进入 Docker Desktop 的 Settings - Docker Engine这里会显示一个 JSON 配置文件。在原有结构里加一项{ registry-mirrors: [https://你的加速地址] }填好之后点击 Apply RestartDocker 引擎会用新的配置重启。之后拉取公共镜像时系统会优先从加速地址拉取。这里要提醒两点。第一加速地址的时效性很强网上流传的公共地址经常变动建议去云服务商或镜像站的后台复制自己专属的加速地址。第二这只是一个拉取镜像的加速通道不是用来访问任何网络资源的工具功能单一别混淆概念。配置完成后可以执行docker info看Registry Mirrors一栏确认是否生效。5. 跑通第一个容器并进入日常开发节奏5.1 hello-world 验证整个环境配置至此已经闭环现在做第一次真正的验证。在 Ubuntu 终端或者 PowerShell 里执行docker run hello-world这条命令会先去镜像仓库拉取一个极小的测试镜像然后运行它。第一次执行需要下载按你的网络和加速配置快则几秒慢则几十秒。如果一直卡在拉取阶段优先检查 registry-mirrors 是否生效、格式是否正确再看网络状况。看到一段Hello from Docker!的输出说明整条链路是通的Docker 客户端能找到引擎引擎能拉取镜像镜像能正常创建并运行容器。到此为止win10 v2004 下 WSL2 部署 Docker 这件事已经成了。5.2 挂载目录别把重要数据放在 /mnt/c 上读写日常开发里免不了要让容器访问 Windows 侧的文件。最常见的做法是挂载目录docker run -it -v /mnt/c/Users/你的用户名/data:/app ubuntu /bin/bash这里的/mnt/c是 Windows C 盘在 WSL2 里的挂载点。能用但性能有代价WSL2 对跨文件系统的访问走的是一个 9P 协议大量小文件读写时明显比 Linux 原生文件系统慢。如果你要跑的是 npm install、maven build、php artisan 这类会产生成千上万小文件的操作建议先把项目数据复制到 WSL2 的内部目录比如~/data再挂载这个内部目录cp -r /mnt/c/Users/你的用户名/data ~/data docker run -it -v ~/data:/app ubuntu /bin/bash这是一个非常实用的经验。同样的操作放在/mnt/c下可能要跑几分钟放到 Linux 内部目录可能只要几十秒。日常使用原则是需要在 Windows 侧编辑的文件放/mnt/c以容器计算为主的临时文件、依赖目录、构建产物放 WSL2 内部。5.3 端口访问的实际经验容器里的服务跑起来后Windows 浏览器直接访问localhost:8080这类地址通常能直接通因为 WSL2 会自动把 localhost 转发下来。这点比老式虚拟机方便太多基本不用额外配置。但如果你想让局域网里的其他设备访问你的容器服务情况就不一样了。WSL2 的网络是一个 NAT 网络容器监听在虚拟网卡的地址上局域网设备用 Windows 的 IP 访问端口是连不上的。一种补救思路是用netsh做端口转发把 Windows 侧某个端口转发到 WSL2 的 localhost。以管理员身份执行netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress127.0.0.1同时开放防火墙netsh advfirewall firewall add rule namewsl2-port dirin actionallow protocolTCP localport8080这样局域网设备就可以通过 Windows 机器的 IP 加 8080 端口访问容器服务了。注意这段配置在系统重启后不会自动保留需要用任务计划或批处理重新执行。如果能不用局域网直连就尽量用 SSH 隧道或者远程环境工具来绕开省心不少。5.4 用 docker compose 搭建一组服务的开发环境单容器验证完了日常开发更多时候是要同时跑多个服务。这时候docker compose就是最顺手的工具。举一个最简单的例子创建一个docker-compose.ymlversion: 3.8 services: redis: image: redis:7 ports: - 6379:6379 web: image: nginx:latest ports: - 80:80 volumes: - ./html:/usr/share/nginx/html然后在文件所在目录执行docker compose up -d它会自动拉取 redis 和 nginx 镜像根据依赖关系启动两个容器并完成端口映射。-d表示后台运行。这在本地搭建前后端联调环境、临时数据库、测试用的消息队列时非常实用。如果你用的是比较旧的 Docker Desktopdocker compose这个子命令可能不存在而是单独的docker-compose命令两者本质一样能识别哪个用哪个就行。安装 Docker Desktop 时通常已经配套好无需额外手动安装。6. 常见问题速查与调试技巧6.1 报错 Please enable the Virtual Machine Platform 但功能已经开启这个报错是 WSL2 部署 Docker 时出现频率最高的误导性错误。表面上提示你开启虚拟机平台功能但你打开 Windows 功能一看明明已经勾选了。真正的原因一般出在三个层面第一BIOS 里的虚拟化没有真正打开任务管理器里检查一下虚拟化已启用/已禁用第二Windows 更新补丁没打全导致虚拟化平台组件工作异常第三WSL2 内核更新包没安装到位。排查顺序我建议固定下来先看任务管理器虚拟化状态再看 Windows 更新最后重新安装内核更新包。不要反复开关 Windows 功能那样浪费时间且多半无效。如果你装了某些系统优化工具把 Hypervisor 相关服务禁用过也要改回来否则虚拟化层根本加载不了。6.2 Docker Desktop 一直 Docker Engine starting这个问题的原因比较分散最常见的三种第一种是旧版 Docker Desktop 的配置残留。解决方法是退出 Docker Desktop删除C:\Users\你的用户名\AppData\Roaming\Docker目录下的配置导出或备份自己需要的内容然后重新启动。第二种是网络代理配置异常。如果你调整过系统的代理设置Docker Desktop 可能还会沿用旧代理导致引擎无法连接镜像仓库或相关服务。到 Settings 里检查 Proxy 配置或者重启软件让它重新读取系统设置。第三种是 WSL 环境内部损坏。执行wsl --shutdown让所有 WSL 发行版完全停止再启动 Docker Desktop。很多卡在启动阶段的场景这一步都能解决。如果还不行右键 Docker Desktop 托盘图标选择 Troubleshoot导出日志仔细看。引擎启动失败都会在日志里留下具体原因比盲猜可靠得多。6.3 WSL2 吃内存太多怎么看和怎么限制WSL2 的内存策略是尽量使用物理内存做缓存这在内存充裕的机器上没问题但 8G 内存的笔记本会明显感到卡顿尤其是同时跑着 IDE、浏览器和 Docker 时。限制内存需要在 Windows 用户目录下新建或编辑一个文件C:\Users\你的用户名\.wslconfig内容如下[wsl2] memory4GB processors2 swap4GB保存后在 PowerShell 执行wsl --shutdown让 WSL2 完全停止再重新打开任发行版或者启动 Docker Desktop配置就会生效。注意.wslconfig文件的存放位置是 Windows 用户目录不是某个 Linux 发行版内部。文件名以点开头Windows 资源管理器里要显示隐藏文件才能看到。这个参数对 WSL1 没有任何作用只影响 WSL2。6.4 wsl --set-version 长时间卡在正在进行转换发行版从 WSL1 切换到 WSL2 时需要把现有文件系统迁移到 vhdx 里这个过程视数据量大小几分钟到十几分钟都可能界面就一直显示正在进行转换。如果长时间没反应先别急着强制结束。可以先另外开一个 PowerShell执行wsl --shutdown把发行版完全停掉再重新执行转换命令。这个过程会重新触发转换逻辑往往能解掉卡死状态。如果反复卡住检查 Windows 更新和内核更新包版本。曾经有相当一部分人最终发现是系统版本太旧缺少 WSL2 转换所需的某些补丁。6.5 Docker 命令在 Ubuntu 终端和 PowerShell 表现不同开启 WSL Integration 后Ubuntu 终端里能直接使用docker是因为 Docker Desktop 把客户端工具和连接配置注入到了发行版环境变量里。PowerShell 那边用的则是 Docker Desktop 安装时写入 PATH 的 docker.exe。两个客户端面向的是同一个引擎最终看到的所有镜像和容器是一致的。我的建议是日常开发固定在一个终端里操作别在两边反复横跳。WSL 终端里有 Docker 集成也能访问/mnt/c下的 Windows 文件PowerShell 也能跑 docker但用户体验明显不如原生 Linux 终端。统一在 Ubuntu 终端里干活既能维持 Linux 命令习惯又能避开 PowerShell 的转义、换行符各种小毛病。如果 Ubuntu 里输入docker提示命令不存在先确认 Docker Desktop 正在运行再执行docker context ls。正常情况下能看到一个desktop-linux的上下文选它负责连接的引擎。确认这些之后终端怎么都不会出问题。最后说点个人体会。我在 win10 v2004 上配置这套环境的经验是整个过程最怕的不是某个命令不会而是版本状态和系统状态不一致BIOS 没开、内核更新包没装、Windows 补丁没打三个问题任意漏掉一个都会在后面某一步冒出看起来完全无关的错误。所以我的固定流程是先winver对版本再打开任务管理器看虚拟化然后才执行那两条 dism 命令重启完第一时间装内核更新包接着设默认版本最后装发行版。这套顺序只要不跳基本十分钟就能跑到docker run hello-world。如果后续遇到镜像拉取慢的问题先把 registry-mirrors 配上再考虑网络本身这是我踩过多次坑之后的真实建议。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑