WSL2 + Ubuntu 20.04 + Docker 在 Windows 10 上的完整配置与避坑指南 简介Windows10下通过WSL2安装Ubuntu20.04并配置Docker环境是开发者搭建跨平台开发与容器化部署的常见需求。这份PDF资源面向已具备基本Windows操作基础、希望快速上手WSL2与Docker的中初级开发者完整梳理了从版本检查、启用Windows功能、安装Ubuntu、更换国内软件源到部署Docker CE的步骤并针对Ubuntu20.04无国内Docker源时如何借用18.04源给出了实用处理方案。包体为单个PDF文档大小190KB内容紧凑、便于离线查阅或打印对照操作。资源已有6728人浏览学习相对成熟可靠。通过阅读该PDF读者可以有效避开版本适配、软件源配置等典型坑点快速建立起WSL2Docker的本地开发环境提升环境搭建效率。 最近好几个朋友问我同一件事Windows 10 上到底怎么把 WSL2、Ubuntu 20.04、Docker 这三样一次配好。折腾过的人都知道单独装任何一个都不难难的是把它们串在一起后出现的各种玄学问题比如 WSL 装好了但版本还是 1、Ubuntu 装完启动直接报错 0x80070003、Docker 镜像怎么拉都慢、甚至 Windows 更新卡在 30% 不敢动。这篇文章就是把我自己踩完坑之后的完整流程和排查思路写出来从版本检查到内核更新从 Ubuntu 安装到 Docker 选型再到最常见的几个坑的处理方式。适合想老老实实把开发环境搭起来的人也适合已经装了一半但卡在某一步的人。1. 动手前的三个关键判断版本、虚拟化、网络很多人上来就按教程敲命令结果折腾半天才发现自己 Windows 10 版本太老或者 BIOS 里虚拟化没开白白浪费时间。开始之前先把这三件事确认好后面几乎不会翻车。1.1 Windows 10 版本与 WSL2 的兼容关系WSL2 用的是轻量级虚拟机技术需要 Windows 10 2004 及以上版本内部版本 19041 及以上才支持。我见过有人在 1903 甚至 1809 上强行装要么装上了也只能用 WSL1要么内核更新包直接提示不支持。打开运行框输入winver就能看到具体版本号。如果你是 21H2、22H2那没问题如果还在 1909建议先把系统更新到 2004 以上。顺带提一句热搜里最常见的windows10更新版本22h2卡在30%这个问题跟 WSL 本身关系不大但如果你一边开着 Docker Desktop 一边跑 Windows 更新确实容易卡住后文会专门说。版本兼容关系可以简单看这个表Windows 10 版本是否支持 WSL2备注1903 / 1909不支持只能使用 WSL12004 / 20H2支持需要手动安装内核更新包21H1 / 21H2支持系统自带部分组件22H2支持目前最稳定推荐1.2 BIOS 虚拟化开关与 Hyper-V 的关系WSL2 底层依赖虚拟化技术所以 CPU 的虚拟化功能必须开启。开机进 BIOS找到 Intel Virtualization Technology 或 SVM ModeAMD 平台设为 Enabled。这个选项不同主板位置不一样但名字基本就这两类。现在的 CPU 基本都支持虚拟化问题是很多品牌机出厂默认关闭。你可以在 Windows 的任务管理器 - 性能 - CPU 里查看虚拟化是否显示已启用。如果显示已禁用先进 BIOS 打开再说。这里有个容易混淆的点WSL2 并不需要你手动去启用 Hyper-V 完整功能系统会自动使用 Hyper-V 底层的虚拟化平台组件。所以在启用或关闭 Windows 功能里只需要勾选虚拟机平台和适用于 Linux 的 Windows 子系统就够了不需要把 Hyper-V 整套勾上勾多了反而可能影响其他虚拟机软件。1.3 网络下载条件提前把安装源准备好WSL2 安装过程需要联网下载几个东西内核更新包、Ubuntu 应用或者根文件系统镜像。国内网络环境下微软商店下载应用偶尔会抽风内核更新包在 GitHub 上也可能慢到怀疑人生。我的建议是提前准备好往这几个地方下载WSL2 Linux 内核更新包微软官方站点搜 WSL2 Linux kernel update packageUbuntu 20.04 应用微软商店或直接搜 Ubuntu 20.04 Appx 下载Docker CE阿里云镜像站或者清华源把这些包先放到本地安装的时候就不会被网络卡住。这里特别强调一下内核更新包一定要下载 x64 版本ARM 设备需要单独选 ARM64 包下载错了安装时会报不适合此计算机的错。2. 三步开启 WSL2 内核控制面板安装与内核升级包干净系统上开启 WSL2 核心就三步启用两个 Windows 功能、安装内核更新包、把默认版本设为 2。顺序最好不要乱我试过先设默认版本再安装内核包虽然最后也能用但命令行会提示找不到 WSL 内核。2.1 启用适用于 Linux 的 Windows 子系统与虚拟机平台用管理员身份打开 PowerShell直接执行这两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完会提示是否重启先别急着重启如果你还要继续敲命令就等会再重启如果已经准备装内核更新包了也可以直接重启后再继续两种方式都可以。有的教程会让你去控制面板 - 程序 - 启用或关闭 Windows 功能里手动勾选效果一样只是命令行方式更适合除了鼠标点其他都嫌慢的人。注意这两条命令执行后如果报错 0x8007007e 之类大概率是当前系统版本太老或者被精简过先检查 winver 版本。2.2 下载并安装 WSL2 内核更新包内核更新包是必须装的这一步很多首次接触 WSL2 的人容易漏掉。装完虚拟机平台功能并不代表 WSL2 内核也在WSL2 和 WSL1 最大的区别就是多了一个真正的 Linux 内核而这个内核在 Windows 10 上需要单独的 MSI 安装包。安装包下载后一路 Next 即可。装完在 PowerShell 里输入wsl --status如果看到 默认版本: 2 或者与 WSL2 相关的字样说明内核已经就位。如果提示不支持检查是不是 Windows 版本不够新。2.3 设置默认版本并验证接着执行这一条让之后安装的所有发行版默认使用 WSL2wsl --set-default-version 2这一步执行后可能会弹出提示需要更新内核或其他组件。如果看到这个提示回到第 2.2 步确认内核更新包装没装对。验证方法是在 PowerShell 里运行wsl -l -v这个命令会列出所有已安装的发行版和它们对应的 WSL 版本。如果将来你装了 Ubuntu 20.04 后发现显示的是 WSL1可以单独转换wsl --set-version Ubuntu-20.04 2转换过程中系统会提示正在进行转换这可能需要几分钟时间之类的话不要关窗口也不要强制重启。3. Ubuntu 20.04 安装与 C 盘空间焦虑的解决办法WSL2 的发行版本质上是一个放在虚拟磁盘ext4.vhdx里的 Linux 系统。默认情况会装到 C 盘用户目录下而且这个虚拟磁盘文件是动态增长的用久了可能二三十 GB对 C 盘紧张的人很不友好。我自己就吃过这个亏在 C 盘塞了一个用完不清理的 WSL最后系统盘直接红了。3.1 从微软商店安装还是下载 Appx / rootfs tar最简单的方式是打开微软商店搜索 Ubuntu 20.04点安装。商店版的好处是自动配置好启动器开始菜单里直接能打开 Ubuntu 终端。缺点是这个安装包有时候下载很慢甚至卡在正在获取不动。如果你遇到商店下载卡死或者你是 LTSC 版本没有商店可以用离线方案搜索 Ubuntu 20.04 AppxBundle 下载下载后把后缀改成 zip解压找到里面 x64 文件夹下的 .appx 文件然后 PowerShell 里用 Add-AppxPackage 安装。还有一种更通用的做法是直接下载 rootfs tar 包这样就不用装应用直接用wsl --import命令导入。我的建议是能商店装就用商店装装不上再用 tar 导入方案。因为商店版自带用户创建流程对新手友好很多。3.2 把 Ubuntu 安装到其他盘导入导出方法如果你希望 Ubuntu 本身放在 D 盘或 E 盘最干净的方法是用wsl --export和wsl --import。第一步先正常安装好 Ubuntu 20.04 并完成初始化设置。然后在 PowerShell 里导出wsl --export Ubuntu-20.04 D:\wsl\ubuntu20.04.tar第二步注销原来的发行版wsl --unregister Ubuntu-20.04第三步导入到目标目录wsl --import Ubuntu-20.04 D:\WSL\Ubuntu20.04 D:\wsl\ubuntu20.04.tar --version 2注意导入后默认登录用户会变成 root而且商店版里设的用户名密码不会保留。解决办法是在 Ubuntu 里执行sudo useradd -m 用户名 sudo passwd 用户名然后回到 PowerShell 用ubuntu2004.exe config --default-user 用户名设置默认用户。这个细节容易被忽略不设置的话后面跑 Docker 时文件权限会很别扭。3.3 安装完先做两件事换源和更新Ubuntu 20.04 默认的 apt 源在国外不换源的话你连apt update都可能等到怀疑人生。国内一般用阿里云或中科大的源。直接改/etc/apt/sources.list把archive.ubuntu.com和security.ubuntu.com替换成镜像站点地址。sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update sudo apt upgrade -y这一步不是可选项是必须项。后面装 Docker 时如果源还是默认的你会体会到什么叫网络不给力。4. Docker 安装选型Docker Desktop 和 Docker CE 到底选哪个在 WSL2 里用 Docker主要有两条路一条是装 Docker Desktop for Windows另一条是直接在 Ubuntu 20.04 里装 Docker CE社区版。两条路我都用过结论是日常开发想省心选 Docker Desktop想要接近生产环境且不占太多资源选 Docker CE。4.1 Docker Desktop 的优缺点和适用人群Docker Desktop 是一个 Windows 应用它启动后会接管 WSL2 里安装的发行版你可以在 Ubuntu 里直接使用docker命令也可以让多个 WSL 发行版共享同一个 Docker 引擎。优点非常明显安装简单图形化管理界面直观还能在 Windows 和 Linux 之间无缝共享容器。缺点也清楚吃内存Docker Desktop 一启动WSL 的 vmmem 进程动不动吃掉好几个 GB 内存如果你电脑只有 8GB 内存开个浏览器加 IDE 再跑几个容器整机就开始卡了。我个人的建议是如果你的工作流主要是用 Docker 跑 MySQL、Redis、Nginx这类固定服务Docker CE 就够省内存也更安静。如果重度依赖 Docker Compose 和 K8s需要频繁查看容器日志和资源曲线可以用 Docker Desktop。4.2 在 Ubuntu 20.04 里安装 Docker CE 的完整步骤这里说 Docker CE 的安装方法。先卸掉可能存在的旧版本sudo apt remove docker docker-engine docker.io containerd runc然后安装依赖sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y添加 Docker 官方 GPG key如果访问慢可以用阿里云的 Docker 源然后配置稳定的仓库。我用的是阿里云镜像地址curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo deb [archamd64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null之后安装sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io -y装完后把当前用户加进 docker 组避免每次敲sudo dockersudo usermod -aG docker $USER然后退出当前终端重进这步很重要组权限刷新需要重新登录。验证一下docker --version docker run hello-world能打印出 Hello from Docker 就说明环境通了。4.3 配置镜像加速与开机自启国内拉 Docker Hub 镜像慢是老问题尤其是 mysql、redis、nginx 这些常用镜像。解决办法是给 Docker 配置镜像加速器。阿里云容器镜像服务里每个人都有一个加速地址格式是https://xxxx.mirror.aliyuncs.com打开阿里云控制台找到容器镜像服务-镜像加速器就能看到。编辑/etc/docker/daemon.json{ registry-mirrors: [https://你的加速地址.mirror.aliyuncs.com] }然后重启 Dockersudo systemctl restart dockerWSL2 里的 systemd 默认是关闭的所以systemctl start docker可能会报错。在 WSL 里更可靠的方式是用sudo service docker start或者直接运行sudo dockerd在前台调试。我建议把 Ubuntu 里/etc/wsl.conf配置一下让 WSL2 在启动时就自动启动 systemd这样 service 和 systemctl 都正常[boot] systemdtrue配置完在 PowerShell 里执行wsl --shutdown再重进 Ubuntu然后sudo systemctl enable docker之后每次打开 WSL UbuntuDocker 服务会自动跑起来。5. 跑起来之后最容易踩的 4 个坑环境搭完不代表万事大吉真正的问题往往在跑起来之后浮出来。这里把我遇到过的、以及后台留言问得最多的四个坑集中写一下。每个坑我都会说清楚现象、原因和处理办法。5.1 docker 镜像下载慢换加速器源现象是docker pull mysql:8.0卡在等待层数据半天不动或者速度只有几十 KB。原因很简单默认的 Docker Hub 镜像仓库服务器在国外网络往返时间长。解决办法就是前面说的配置daemon.json镜像加速。配置完之后拉镜像会快很多。另外再说一个技巧如果你需要经常拉某个镜像可以先把镜像拉下来再用docker save导出成 tar 文件在另一台机器上docker load导入对于内网环境尤其好用。5.2 vmmem 占用内存过高限制 WSL2 内存很多人装完 Docker Desktop 后打开任务管理器发现vmmem这个进程占用好几个 GB 内存。这是 WSL2 虚拟机正常的内存占用但 Windows 默认会把所有可用内存都给 WSL 使用导致宿主机越来越卡。解决办法是在用户目录下新建一个.wslconfig文件内容如下[wsl2] memory4GB processors2 swap2GB设置完在 PowerShell 里执行wsl --shutdown再重启 WSL内存立刻降下来。注意这个配置只对 WSL2 生效WSL1 没有这个文件的概念。内存限制要根据你的机器配置来调8GB 内存的机器建议限制到 3GB 或 4GB16GB 内存可以给 6GB。5.3 Windows 更新卡在 30% 的排查思路热搜里windows10更新版本22h2卡在30%出现的频率很高我和几个朋友都遇到过。这个问题的原因不太一样但如果你是在安装 WSL 和 Docker 之后出现的大概率跟虚拟机平台组件或 WSL 后台进程有关。我当时遇到的情况是更新提示需要重启重启后卡在 30% 不动风扇狂转。等了半小时后我强制断电重启Windows 居然回滚到了旧版本。排查思路可以按这个顺序来先关掉 Docker Desktop按Win X选择Windows PowerShell管理员执行wsl --shutdown确保没有 WSL 进程在跑。暂时禁用虚拟机平台功能重启后再尝试更新更新完再重新启用。检查系统盘空间Windows 大版本更新需要至少 20GB 可用空间空间不足时也会卡在某个百分比。如果你不确定是不是 WSL 影响的可以在更新前把 WSL 发行版导出备份然后wsl --unregister临时移除更新完再导入。虽然麻烦一点但总比系统更新失败、回滚之后一脸懵好。5.4 WSL2 网络和 DNS 解析问题WSL2 因为使用了 NAT 网络偶尔会出现宿主机能上网但 Ubuntu 里ping baidu.com超时或者apt update报 Temporary failure resolving。常见原因有两个一个是 Windows 防火墙拦截了 WSL 的子网流量另一个是/etc/resolv.conf里的 DNS 地址指向了 Windows 虚拟网卡但那个地址偶尔会失效。最快的临时解决方法是手动设置一个可用的 DNSsudo rm /etc/resolv.conf sudo bash -c echo nameserver 223.5.5.5 /etc/resolv.conf但这样设置后每次重启 WSL 都可能被覆盖回去。更稳妥的做法是在/etc/wsl.conf里添加[network] generateResolvConf false然后手动创建/etc/resolv.conf。如果你用的是公司内网或者特殊路由器DNS 设置可能还要结合实际情况调整。这个配置我建议只在确实遇到问题时再改没问题就不要动保持默认就行。6. 环境搭好后的日常使用技巧环境跑通之后日常使用中有几个小习惯能让你舒服很多。6.1 用 Windows Terminal 管理 WSLWindows Terminal 几乎可以说是 WSL 用户必备的终端工具它可以把 PowerShell、CMD、Ubuntu 的标签页放在同一个窗口里还能自定义配色和字体。装好之后下拉菜单里直接就有 Ubuntu 选项点开就是 WSL2 的 Bash 环境比开始菜单里单独的 Ubuntu 图标好用太多。而且 Windows Terminal 支持在任意目录右键打开你在项目文件夹里右键选择在终端中打开再切到 Ubuntu 标签页就直接进入当前目录了省去反复 cd 的麻烦。6.2 把 WSL2 当独立服务器维护的几个习惯我平时习惯把 WSL2 看作一台迷你 Linux 服务器来用而不是一个玩具环境。Docker 容器里的 MySQL 和 Redis 直接映射端口到 Windows 本机。项目代码放在 Windows 文件系统里但 Docker 容器挂载的目录放在 WSL2 内部文件系统。这样做的好处是文件读写性能更好避免跨文件系统的 I/O 开销。配置文件方面建议把常用的 docker-compose.yml 统一放在~/docker/目录下每个项目一个子目录。后期备份只需要打包这个目录还原的时候一条命令全部拉起来。最后再说一个和 D 盘迁移相关的点WSL2 的虚拟磁盘文件会随着容器和镜像增多不断膨胀即使删掉镜像也不会自动收缩。如果发现磁盘文件太大可以在关掉 WSL 后运行Optimize-VHD -Path D:\WSL\Ubuntu20.04\ext4.vhdx -Mode Full这个命令是 Hyper-V 模块里的Windows 10 专业版或企业版自带。家庭版没有完整 Hyper-V 工具也可以直接用 DiskPart 的 compact 命令收缩 VHDX。我自己是每个月整理一次磁盘能收回好几个 GB。这套流程前前后后装过差不多十次每次遇到问题都记了笔记。说实话 WSL2 现在的稳定度已经比刚发布时好很多但微软文档写得太分散新手顺着官方文档走一遍下来还是会卡在各种奇怪的地方。如果你按照这篇文章的顺序操作遇到问题对照第 5 章的排查思路处理基本能一路顺畅。装好之后记得先备份一份 WSL 导出包万一哪天系统重置了一条命令就能恢复整个开发环境。本文还有配套的精品资源点击获取