📝 本文首发于 栏轩·阁
欢迎访问阅读原文,获取更好的阅读体验。
一、什么是 WSL?
WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统) 是微软官方推出的一项功能,它允许开发者在 Windows 系统上直接运行 GNU/Linux 环境 ------包括大多数命令行工具、实用程序和 GUI 应用------而无需传统的虚拟机或双系统启动。
WSL 1 vs WSL 2
WSL 有两个主要版本,它们的架构和适用场景不同:
| 特性 | WSL 1 | WSL 2 ✅(推荐) |
|---|---|---|
| 架构 | 将 Linux 系统调用转换为 Windows 系统调用(兼容层) | 轻量级虚拟机中运行完整 Linux 内核 |
| 系统调用兼容性 | 大部分兼容,但不完全 | 完全兼容,可运行几乎所有 Linux 应用 |
| 文件系统性能 | 访问 Windows 文件极快 | 访问 Linux 文件极快(~1000 MB/s),跨 OS 访问较慢 |
| 启动速度 | 几乎瞬时 | 秒级启动(< 10 秒) |
| 资源占用 | 极低 | 较低(动态分配,按需使用) |
🔥 2025 年里程碑 :微软于 2025 年 5 月 19 日正式宣布 WSL 开源!源代码已发布在 GitHub:microsoft/WSL,社区可以直接参与改进。截至 2026 年,WSL 已迭代至 2.5.x 版本,功能日趋完善。
二、为什么要使用 WSL?
在现代软件开发中,越来越多的工具和框架原生运行在 Linux 环境(Docker、Node.js、Python、Ruby、各类数据库等)。WSL 让 Windows 用户无需离开熟悉的桌面环境,就能获得原生 Linux 的开发体验。
核心优势
| 优势 | 说明 |
|---|---|
| 🔗 无缝集成 | Windows 和 Linux 之间自由切换,共享文件系统。Linux 目录可在资源管理器中直接访问(\\\\wsl.localhost\\Ubuntu\\home\\) |
| ⚡ 轻量高效 | 无需为 Linux 分配固定内存,资源按需动态分配,启动仅需数秒 |
| 🐳 原生 Docker 支持 | Docker Desktop 可直接利用 WSL2 后端运行,性能接近原生 Linux |
| 🎨 图形界面支持(WSLg) | Linux GUI 应用像 Windows 原生窗口一样运行,支持任务栏集成和剪贴板共享 |
| 🖥️ GPU 加速 | 支持 GPU 用于机器学习、数据科学等计算密集型任务 |
三、WSL 与直接开 Linux 虚拟机的对比
很多新手会问:"为什么不直接用 VMware 或 VirtualBox 装个 Linux 虚拟机?" 下表给出了详细答案:
| 对比维度 | WSL 2 ✅ | 传统 Linux 虚拟机 |
|---|---|---|
| 启动时间 | ⚡ 秒级(< 10 秒) | 🐢 数分钟(完整开机流程) |
| 内存占用 | 💚 动态分配,用多少占多少 | 💔 固定预分配(如 2GB/4GB),即使空闲也被占用 |
| 磁盘占用 | 💚 几百 MB ~ 数 GB | 💔 数 GB ~ 数十 GB |
| Windows 集成 | 🔥 深度无缝(文件共享、剪贴板、网络互通) | ❌ 隔离,需额外配置共享文件夹 |
| Docker 支持 | ✅ 原生级,Docker Desktop 直接利用 WSL2 后端 | ⚠️ 需在虚拟机内再装 Docker,且嵌套虚拟化性能有损 |
| GUI 桌面 | ⚠️ 有限(WSLg 支持单个应用窗口行化运) | ✅ 完整桌面环境(GNOME/KDE/XFCE) |
| USB 直通 | ⚠️ 需额外工具(usbipd-win) | ✅ 原生支持(VirtualBox Extension Pack / VMware USB Arbitration) |
| 快照/克隆 | ❌ 无内置支持 | ✅ 内置快照与克隆,测试回滚方便 |
| 内核定制 | ❌ 受限(使用微软提供的通用内核) | ✅ 可加载任意内核模块、修改启动参数 |
| 网络控制 | ⚠️ NAT 模式,IP 动态变化 | ✅ 支持静态 IP、桥接模式、Host-Only 等多种网络 |
选型建议
| 适用场景 | 推荐方案 |
|---|---|
| Web 开发、后端开发、DevOps、容器化工作 | 🎯 WSL 2 --- 启动快、资源省、与 Windows 集成好 |
| 完整 Linux 桌面、GUI 软件测试、内核开发 | 🎯 传统虚拟机 --- 完整桌面、硬件直通、快照回滚 |
| 日常开发 + 偶尔需要完整 Linux 环境 | 🎯 两者兼用 --- WSL 2 主力开发,虚拟机做测试 |
四、总体流程概览
本教程按以下步骤依次进行,流程图如下:
┌─────────────────────────────────────────────────────────┐
│ Windows 11 系统 │
│ │
│ ① 激活 WSL 功能(`wsl --install`) │
│ ↓ │
│ ② 安装 Ubuntu 22.04 LTS │
│ ↓ │
│ ③ 验证 WSL 可用(`wsl -l -v`) │
│ ↓ │
│ ④ 安装 Docker Desktop │
│ ↓ │
│ ⑤ 配置 Docker 镜像加速器 │
│ ↓ │
│ ⑥ Docker Desktop → WSL Integration 关联 Ubuntu │
│ ↓ │
│ ⑦ 安装 FinalShell / 配置 SSH → 连接 Ubuntu │
│ ↓ │
│ ⑧ 在 Ubuntu 中测试 Docker 可用性(hello-world) │
└─────────────────────────────────────────────────────────┘
五、为什么选择 Ubuntu 来存放数据卷?
在 WSL 中使用 Ubuntu 有一个极其重要的最佳实践,直接影响你的开发体验和项目性能。
核心原则:文件必须放在 Linux 文件系统中
很多初学者习惯把项目文件放在 Windows 的 C:\Users\... 目录下,然后挂载到 Docker 容器中------这是重大误区!来看实测数据:
| 文件存放位置 | 读写性能 | inotify(热重载) | 推荐度 |
|---|---|---|---|
WSL 内部 (/home/用户/projects/) |
🚀 ~1000 MB/s | ✅ 正常工作 | ⭐⭐⭐ 强烈推荐 |
Windows 目录挂载(/mnt/c/Users/...) |
🐢 ~300 MB/s | ❌ 不支持 | ❌ 避免使用 |
📊 真实案例 :一个 ComfyUI Docker 工作负载,将文件从
/mnt/c/...移到 WSL 文件系统后,运行时间从 5 分钟缩短到 70 秒 ,性能提升了 3 倍以上!
为什么性能差异这么大?
WSL 2 架构决定了:
- Linux 文件系统(ext4):WSL 2 虚拟机内部的原生文件系统,操作直接在内核中完成,没有跨 OS 开销
- Windows 文件系统挂载点 (
/mnt/c/):通过 9P 协议 (Plan 9 Filesystem Protocol)在 Windows 和 Linux 之间传输数据,每次读写都要经过协议转换,并且 不支持 inotify 事件------这意味着热重载(nodemon、webpack --watch 等)完全无法工作
标准项目开发流程
将 Ubuntu 作为数据卷的存放中心,符合一般项目的标准开发流程:
Windows 文件系统(仅供浏览器查看/编辑配置文件)
│
WSL Ubuntu 文件系统 /home/用户/projects/
│ ← 所有项目源码放在这里!
│
Docker 容器
│ ← 通过 -v 挂载 Ubuntu 路径到容器内部
│ docker run -v ~/my-project:/app ...
│
数据持久化
│ ← Named Volume 存放数据库、上传文件等
│ docker volume create pgdata
│ docker run -v pgdata:/var/lib/postgresql/data ...
六、详细安装步骤
6.1 激活 WSL
方法一:一键安装(推荐 ✅)
以管理员身份打开 PowerShell 或 Windows Terminal,执行:
powershell
wsl --install
这一条命令会自动完成所有操作:
- ✅ 启用"适用于 Linux 的 Windows 子系统"功能
- ✅ 启用"虚拟机平台"功能
- ✅ 下载并安装最新的 WSL2 Linux 内核
- ✅ 将 WSL 2 设置为默认版本
- ✅ 默认安装 Ubuntu 发行版
安装完成后,重启计算机。
方法二:手动分步安装(备选)
如果一键安装失败,可以手动操作:
powershell
# 以管理员身份运行
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重启后,下载并安装 WSL2 内核更新包:
设置 WSL 2 为默认版本:
powershell
wsl --set-default-version 2
6.2 安装 Ubuntu 22.04 LTS
安装完成后,在开始菜单找到并打开 Ubuntu 应用,或在 PowerShell 中运行:
powershell
wsl
首次启动时按以下步骤操作:
① 等待解压文件(约 1~2 分钟,取决于机器性能)
② 创建 UNIX 用户名和密码
- 输入用户名(与 Windows 登录名无关)
- 输入密码(输入时屏幕不显示是正常现象)
- 确认密码
③ 更新包管理器
bash
sudo apt update && sudo apt upgrade -y
💡 如果安装的不是 Ubuntu 22.04,可以指定版本安装:
powershellwsl --install -d Ubuntu-22.04查看所有可用发行版:
wsl --list --online
6.3 验证 WSL 是否正常工作
在 PowerShell 中执行:
powershell
wsl -l -v
输出应类似:

确认 VERSION 列为 2,说明 WSL 2 已正确启用。
若显示为 1,执行以下命令升级:
powershell
wsl --set-version Ubuntu 2
6.4 安装 Docker Desktop
下载
从 Docker 官网下载安装包:
👉 https://docs.docker.com/desktop/setup/install/windows-install/
安装步骤
- 双击运行安装程序
Docker Desktop Installer.exe - 按照向导提示完成安装
- 关键步骤 :安装过程中确保勾选 "Use WSL 2 instead of Hyper-V"(如果出现该选项)
安装完成后,重启计算机(如果提示)。
首次启动
- 启动 Docker Desktop(开始菜单搜索 "Docker")
- 接受服务条款
- 等待 Docker Engine 启动(系统托盘中出现鲸鱼图标且不再转圈)
- 如果是第一次运行,可能需要几分钟来初始化
6.5 配置 Docker 镜像加速器
由于网络原因,直接从 Docker Hub 拉取镜像可能非常慢。配置国内镜像加速器可以显著提升下载速度。
操作步骤
- 打开 Docker Desktop
- 点击右上角 ⚙️ Settings(设置)
- 左侧导航选择 Docker Engine
- 在 JSON 配置中添加
registry-mirrors字段 - 点击 Apply & Restart 使配置生效
推荐配置
json
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.1panel.live"
]
}
⚠️ 注意:国内镜像源有时效性,如果某个地址失效,请更换其他可用地址。建议配置 3~5 个备选。
验证加速器是否生效
bash
docker --version
docker info
在 docker info 输出中查找 Registry Mirrors 字段,应显示你刚配置的地址列表。
速度对比测试:
bash
# 加速前:可能数分钟甚至超时
# 加速后:十几秒到几十秒
time docker pull nginx
6.6 在 Docker Desktop 中启用 WSL 集成
这是让 Docker 与 Ubuntu 联动的关键步骤 ,完成后你就可以在 Ubuntu 终端中直接使用 docker 命令。
- 打开 Docker Desktop → ⚙️ Settings
- 左侧导航 → Resources → WSL Integration
- 勾选以下选项:
- ✅
Enable integration with my default WSL distro - ✅
Ubuntu-22.04(或你安装的其他发行版)
- ✅
- 点击 Apply & Restart 重启 Docker Desktop

图示说明:Settings → Resources → WSL Integration → 勾选 Ubuntu → Apply & Restart
设置完成后,在 WSL Ubuntu 终端中运行 docker ps 验证是否可正常连接 Docker 引擎。
6.7 使用 FinalShell 连接 Ubuntu
虽然可以直接在 Ubuntu 终端窗口中操作,但使用 FinalShell 这样的 SSH 客户端工具可以获得更好的体验------多标签支持、内置文件管理器、实时性能监控等。
安装 FinalShell
下载地址:
- Windows :http://www.hostbuf.com/downloads/finalshell_install.exe
- macOS :http://www.hostbuf.com/downloads/finalshell_install.pkg
在 Ubuntu 中配置 SSH 服务
在 WSL Ubuntu 终端中执行:
bash
# 1. 更新包列表
sudo apt update
# 2. 安装 OpenSSH 服务器
sudo apt install openssh-server -y
# 3. 启动 SSH 服务
sudo service ssh start
# 4. 查看 SSH 服务状态(确认显示 active/running)
sudo service ssh status
设置 SSH 开机自启(WSL 重启后自动启动):
在 ~/.bashrc 末尾添加:
bash
# 自动启动 SSH 服务
if ! service ssh status > /dev/null 2>&1; then
sudo service ssh start
fi
为避免每次输入 sudo 密码,配置免密:
bash
echo "$USER ALL=(ALL) NOPASSWD: /usr/sbin/service ssh start" | sudo tee -a /etc/sudoers
获取 Ubuntu 的 IP 地址
在 WSL Ubuntu 终端中执行:
bash
hostname -I
记下显示的 IP 地址(通常为 172.x.x.x 网段)。
⚠️ 注意:WSL 的 IP 地址在宿主机网络环境变化后可能会改变,每次重新连接前需确认 IP。
在 FinalShell 中配置 SSH 连接
- 打开 FinalShell
- 点击左上角 文件夹图标 → 点击 白色 "+" 号 → 选择 SSH 连接(Linux)
- 填写以下信息:
| 配置项 | 填写内容 |
|---|---|
| 名称 | 任意,如 "WSL Ubuntu" |
| 主机 | 上一步获取的 IP 地址 |
| 端口 | 22(默认 SSH 端口) |
| 用户名 | 你的 Ubuntu 用户名 |
| 密码 | 对应的密码 |
| 认证方法 | 密码 |
- 点击 确定 保存配置
- 双击该连接即可进入 Ubuntu 终端

连接成功后:可以最小化 Ubuntu 的终端窗口了,以后直接在 FinalShell 中操作,还支持文件拖拽上传、实时监控等功能。
其他连接工具推荐
| 工具 | 特点 | 适用场景 |
|---|---|---|
| VS Code Remote - WSL | 在 VS Code 中直接打开 WSL 项目 | ⭐ 最推荐------日常开发首选 |
| Windows Terminal | 微软官方终端,默认支持 WSL 标签页 | 轻量级命令行操作 |
| MobaXterm | 功能丰富的终端 + X11 转发 | 需要图形界面时 |
| Putty | 经典轻量级 SSH 客户端 | 临时快速连接 |
6.8 测试 Docker 是否可用
在 FinalShell 或 WSL Ubuntu 终端中执行以下命令:
① 查看 Docker 版本
bash
docker version
确认 Client 和 Server 都有版本信息输出。如果只显示 Client 没有 Server,说明 Docker 引擎未启动。
② 运行 Hello World 容器
bash
docker run hello-world
如果看到以下输出,说明环境搭建成功!🎉
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from the image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
③ 进阶测试:运行 Nginx 容器
bash
# 拉取并运行 Nginx 容器(映射到本机 8080 端口)
docker run -d -p 8080:80 --name my-nginx nginx
# 查看运行中的容器
docker ps
# 测试访问
curl http://localhost:8080
然后打开浏览器访问 http://localhost:8080,应该能看到 Nginx 欢迎页面!
④ 清理测试容器
bash
# 停止并删除 Nginx 容器
docker stop my-nginx
docker rm my-nginx
# 查看所有容器(包括已停止的)
docker ps -a
七、进阶:迁移 Docker 数据到 D 盘(释放 C 盘空间)
Docker Desktop 默认将所有镜像、容器和数据存储在 C 盘,具体位置为:
C:\Users\用户名\AppData\Local\Docker\wsl\data\ext4.vhdx
这个文件会随着使用快速增长(轻松达到 10~30 GB),严重挤占 C 盘空间。建议将其迁移到 D 盘。
迁移步骤
以管理员身份打开 PowerShell,依次执行以下命令:
powershell
# 1. 退出 Docker Desktop(系统托盘右键 → Quit Docker Desktop)
# 2. 关闭所有 WSL 实例
wsl --shutdown
# 3. 在 D 盘创建迁移目录
mkdir D:\WSL\docker\docker-desktop -Force
mkdir D:\WSL\docker\docker-desktop-data -Force
mkdir D:\WSL\tmp -Force
# 4. 导出 docker-desktop-data(这是存储镜像的大户,体积大请耐心等待)
wsl --export docker-desktop-data D:\WSL\tmp\docker-desktop-data.tar
# ⏳ 导出时间取决于数据量大小,可能数分钟到数十分钟
# 5. 注销 C 盘的原实例(释放 C 盘空间)
wsl --unregister docker-desktop-data
# 6. 导入到 D 盘新位置
wsl --import docker-desktop-data D:\WSL\docker\docker-desktop-data D:\WSL\tmp\docker-desktop-data.tar --version 2
# 7. 验证导入成功
wsl --list -v
# 应看到 docker-desktop-data 状态为 Stopped
# 8. 启动 Docker Desktop 验证功能正常
确认无误后删除临时文件:
powershell
Remove-Item D:\WSL\tmp\docker-desktop-data.tar
💡 一键迁移脚本 :可将以上步骤保存为
migrate-docker.ps1脚本,以后新电脑直接运行。
八、开发工作流最佳实践
环境搭建好之后,推荐按照以下最佳实践进行日常开发。
8.1 日常开发流程
bash
# 1. 在 WSL Ubuntu 中创建项目目录
cd ~
mkdir -p projects && cd projects
# 2. 克隆项目(确保代码在 Linux 文件系统中)
git clone https://github.com/your-org/your-project.git
cd your-project
# 3. 使用 VS Code 打开(推荐安装 Remote - WSL 扩展)
code .
# 4. 使用 Docker Compose 启动开发环境
docker compose up -d
# 5. 进行开发 ------ 热重载正常工作!🔥
💡 关键点 :始终通过
\\\\wsl.localhost\\Ubuntu\\home\\用户名\\projects\\访问项目文件,不要通过C:\\Users\\...访问。
8.2 数据持久化策略
| 数据类型 | 推荐方案 | 示例 |
|---|---|---|
| 数据库(PostgreSQL/MySQL) | Named Volume | docker volume create pgdata |
| 用户上传文件 / 媒体 | Named Volume | docker volume create uploads |
| 项目源码(开发环境) | Bind Mount(Linux 路径) | -v ~/project:/app |
| 配置文件 | Bind Mount | -v ./config:/app/config |
| 缓存 / node_modules | Anonymous Volume | /app/node_modules |
Named Volume vs Bind Mount 对比:
| 特性 | Named Volume | Bind Mount |
|---|---|---|
| 主机位置 | Docker 管理(/var/lib/docker/volumes/...) |
你指定任何路径 |
| 性能(WSL2) | ✅ 优秀 | ✅ 优秀(Linux→Linux) |
| 自动初始化容器内容 | ✅ 是 | ❌ 否 |
| 支持 Volume 驱动 | ✅ 是 | ❌ 否 |
| 适用场景 | 数据库、持久数据 | 开发代码、热重载 |
8.3 资源限制配置
如果发现 WSL 占用内存过多,可以创建 %UserProfile%\\.wslconfig 文件进行限制:
ini
[wsl2]
memory=8GB # 限制 WSL 2 VM 最大内存
processors=4 # 限制 CPU 核心数
swap=2GB # 交换分区大小
localhostForwarding=true # 允许 Windows 访问 WSL 的 localhost
保存后执行 wsl --shutdown 并重新启动 WSL 使配置生效。
8.4 定期清理
bash
# 查看 Docker 磁盘使用情况
docker system df
# 清理未使用的容器、镜像、卷
docker system prune -a
# 仅清理悬空镜像
docker image prune
九、总结
通过本教程,你已经在 Windows 上搭建了一套完整、高效、生产级的开发环境:
| 组件 | 作用 | 状态 |
|---|---|---|
| ✅ WSL 2 | 轻量级 Linux 运行环境 | 已激活 |
| ✅ Ubuntu 22.04 LTS | 稳定的 Linux 发行版,作为开发主力 | 已安装 |
| ✅ Docker Desktop | 容器化开发的核心工具 | 已配置 |
| ✅ FinalShell | 便捷的 SSH 远程连接和管理工具 | 已连接 |
| ✅ Docker 镜像加速 | 加速镜像拉取 | 已配置 |
| ✅ 数据迁移 | Docker 数据迁移到 D 盘,释放 C 盘空间 | 已完成 |
这套方案兼具了 Windows 的优秀桌面体验 和 Linux 的强大开发能力,是目前 Windows 开发者的首选方案。无论是 Web 开发、后端服务、DevOps 还是数据科学,这套环境都能胜任。
关键要点回顾
- 📂 项目文件务必放在 WSL 文件系统中 (
~/projects),不要放在/mnt/c/------性能相差 3 倍以上 - 🐳 Docker 数据及时迁移到 D 盘,避免 C 盘被撑爆
- 🔄 Ubuntu 作为数据卷中心,项目代码 → Docker 挂载 → 容器开发,流程丝滑
- 🛠️ VS Code Remote - WSL 是最推荐的开发方式