Windows 的 WSL 2 配置(Docker 必备环境)
1. 为什么 Docker Desktop 需要 WSL 2?
性能更好:相比传统 Hyper-V 虚拟化,WSL 2 提供接近原生 Linux 的性能
资源占用更低:轻量级虚拟化,启动更快
直接访问文件系统:Windows 和 Linux 文件系统互通
2. 安装前检查
系统要求
Windows 10 版本 2004 或更高(内部版本 19041+)
Windows 11 所有版本
64位系统,支持虚拟化
检查虚拟化是否启用
打开任务管理器 → "性能" 选项卡
查看 "虚拟化" 是否显示 "已启用"
如果未启用,需要:进入 BIOS 开启 VT-x (Intel) 或 SVM (AMD)关闭 Hyper-V(如果已安装)
3. 分步安装配置 WSL 2
步骤 1:启用 WSL 功能
以管理员身份运行 PowerShell:
# 启用 WSL 功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用虚拟机平台功能
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 重启计算机
Restart-Computer
步骤 2:安装 WSL 2 内核更新
下载并安装:WSL2 Linux 内核更新包 x64
步骤 3:设置 WSL 2 为默认版本
wsl --set-default-version 2
步骤 4:安装 Linux 发行版
打开 Microsoft Store
搜索并安装 Ubuntu(推荐 20.04/22.04)
安装后从开始菜单启动,完成初始化设置(创建用户名/密码)
步骤 5:验证 WSL 2
wsl -l -v
正常输出应类似:
NAME STATE VERSION
* Ubuntu Running 2
4. Docker Desktop 集成 WSL 2
配置 Docker 使用 WSL 2 后端
打开 Docker Desktop → Settings
选择 General → 勾选 "Use WSL 2 based engine"
选择 Resources → WSL Integration
启用已安装的 Linux 发行版(如 Ubuntu)
可勾选 "Enable integration with my default WSL distro"
验证 Docker 与 WSL 2 集成
# 在 Windows PowerShell 中测试
docker run --rm hello-world
# 在 WSL 终端中测试
wsl
docker run --rm alpine uname -a
5. 常见问题解决
问题 1:WSL 2 安装后无法启动
# 重置 WSL
wsl --shutdown
wsl --unregister Ubuntu
问题 2:Docker 无法连接到 WSL
# 确保 Docker 服务运行
net start com.docker.service
# 重置 Docker-WSL 集成
dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
问题 3:文件系统性能慢
# 将项目文件放在 WSL 文件系统中(如 /home/username/project)
# 而不是 Windows 挂载的 /mnt/c/...
6. 高级配置(可选)
调整 WSL 2 资源限制
在 %USERPROFILE%.wslconfig 中添加:
[wsl2]
memory=6GB # 限制内存使用
processors=4 # CPU 核心数
swap=2GB # 交换空间
使用 GPU 加速(需要 NVIDIA 显卡)
# 安装 NVIDIA CUDA on WSL 驱动
# 下载地址:
🔹 最佳实践建议
项目文件位置:将代码放在 WSL 文件系统内(如 ~/project)而非 /mnt/c/
终端选择:使用 Windows Terminal + WSL 2 组合
Docker 数据:大容量数据卷建议放在 WSL 文件系统
测试 WSL 2 性能:# 在 WSL 终端中运行time docker run --rm -it ubuntu bash -c "for i in {1..1000}; do echo $i; done"