WSL 全称 Windows Subsystem for Linux,即运行在 Windows 上的 Linux 子系统。在 WSL 上部署 Docker ,实现 Windows 上运行 Docker 的功能。
如何判断电脑是否支持硬件虚拟化
打开任务管理器,如果处理器支持硬件虚拟化,能看到”虚拟化“和”Hyper-v“选项的(启用或者禁用),否则就是处理器不支持虚拟化。

如果是“禁用”状态,进入 BIOS 来打开虚拟化支持。重启电脑,F2 进入 BIOS 设置,可以看到 Intel Virtualization Technology 选项默认是 Disabled 状态,我把它改成 Enabled,然后保存,重启电脑。
Windows 11家庭版安装 Docker
Hyper-V 功能仅在 Windows 专业版、企业版和教育版中可用,家庭版不支持 Hyper-V 功能(也可以直接使用 WSL 来虚拟 Linux 环境则可以忽略此操作)。
为了解决这一问题,我们需要通过自行创建 cmd 指令执行。
创建 cmd 文件
首先需要创建一个 cmd 文件,命名为 Hyper-V.cmd
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
点击右键,选择以管理员身份运行。执行完成后,需要点击 Y 进行重启生效相应的配置。
安装 WSL
安装 WSL 需要硬件和系统设置均支持虚拟化。如果软硬件符合条件,管理员身份运行:
# 指定 Ubuntu 22.04 作为默认的 Linux 发行版安装 WSL(可能需要魔法上网才行)
wsl --install -d Ubuntu-22.04
# 安装好 WSL 后,你需要根据实际情况安装 Linux 发行版。在 Microsoft Store 中搜索 wsl 即可下载你想要的 Linux 发行版
# 查询可用的 WSL 分发列表(可能需要魔法上网才行)
wsl --list --online
# 更新 WSL 本身及其底层组件
wsl --update
DockerDesktop
-
DockerDesktop 是 Windows 上 Docker 的完整运行环境,是最简单的方式让 Docker 在 WSL 和 Windows 里“开箱即用”。
-
卸载 DockerDesktop 后,也可以自己在 WSL 内装 Docker Engine 使用 Docker。
基于 WSL2 和 Hyper-V 安装 DockerDesktop
下载 DockerDesktop
基于 WSL2 安装 DockerDesktop
第一个选项是要基于 WSL2 安装还是基于 Hyper-V 安装? 它默认推荐你基于 WSL2 安装。

按照推荐的,安装完后,自动勾选。

上面打钩也可以使用脚本实现
# 启用 Windows 子系统 Linux 版
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用虚拟机器平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
WSL2 本身就是一个完整的 Linux 内核,你不需要单独安装 Linux 发行版,DockerDesktop 就可以直接基于 WSL2 运行。
当执行 wsl --list --verbose 时,启动的 DockerDesktop 会被当成 Linux 发行版罗列出来。
skypc@WIN107:/mnt/c/Users/skypc$ exit
logout
PS C:\Users\skypc> wsl -l -v
NAME STATE VERSION
* docker-desktop Running 2
docker-desktop-data Running 2
Windows Subsystem for Linux (WSL) 2 是 Microsoft 构建的完整 Linux 内核,它允许 Linux 发行版在不管理虚拟机的情况下运行。通过在 WSL 2 上运行 Docker Desktop,用户可以利用 Linux 工作区并避免同时维护 Linux 和 Windows 构建脚本。此外,WSL 2 还改进了文件系统共享和启动时间。
当然也可以单独安装一个 Linux 发行版,然后让 DockerDesktop 基于此发行版运行。
WSL 2 向 Windows 添加了对“Linux 发行版”的支持,其中每个发行版的行为就像一个 VM,只不过它们都运行在单个共享 Linux 内核之上。
Docker Desktop 不需要安装任何特定的 Linux 发行版。 docker CLI 和 UI 在 Windows 上都可以正常工作,无需任何额外的 Linux 发行版。然而,为了获得最佳的开发人员体验,我们建议至少安装一个额外的发行版并启用 Docker 支持
将如何将安装的 Linux 发行版与 DockerDesktop 集成?
执行 wsl --install,默认安装 Ubuntu,然后 DockerDesktop 启用“集成WSL默认发行版的”。
查看一下当前有几个发行版,可以看到,除了 docker 的两个,多了一个 Ubuntu。
skypc@WIN107:/mnt/c/Users/skypc$ exit
logout
PS C:\Users\skypc> wsl -l -v
NAME STATE VERSION
* docker-desktop Running 2
Ubuntu-22.04 Running 2
docker-desktop-data Running 2
基于 Hyper-V 进行安装 DockerDesktop
首先删除 DockerDesktop
重新安装 DockerDesktop,到这一步,取消勾选第一项,我们基于 Hyper-V 安装,不按他推荐的。

最终,DockerDesktop 会自动设置了“Hyper-V”和“容器”这两个特性

在 WSL 内安装 Docker Engine
# 指定 Ubuntu 22.04 作为默认的 Linux 发行版安装 WSL(可能需要魔法上网才行)
wsl --install -d Ubuntu-22.04
# 在 Ubuntu 里执行
sudo apt update
sudo apt install -y ca-certificates curl gnupg
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动 docker
sudo systemctl enable --now docker
WSL 配置
WSL 有 2 个重要的配置文件 .wslconfig 和 wsl.conf,其中 .wslconfig 位于 Windows 系统上,wsl.conf 位于 Linux 发行版系统上。
配置 .wslconfig 文件
首先介绍配置 .wslconfig。打开 .wslconfig 文件目录:Win+R 运行 %UserProfile% ,会打开用户目录,然后新建一个 wslconfig 文件。 .wslconfig 配置可以参考如下内容:
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
hostAddressLoopback=true
dnsTunneling=true
firewall=true
autoProxy=true
配置 wsl.conf 文件
wsl.conf 的作用是配置自启动程序、磁盘自动挂载等,文件目录为:/etc/wsl.conf。
下面是参考案例:
[boot]
systemd=true
本文 WSL 采用了 networkingMode=mirrored 镜像网络模式,好处是可以用 Windows 相同 IP 访问到 docker 。但是必须配置一下,否则无法访问 docker 容器。
方法一:ignoredPorts
在 .wslconfig 中通过 ignoredPorts 命令设置放行的端口,通过这些端口可以顺利访问你部署的 docker 容器。
[experimental]
networkingMode=mirrored
hostAddressLoopback=true
ignoredPorts = 8000,8080
方法二:hostAddressLoopback
在 .wslconfig 中添加 hostAddressLoopback=true, 允许Windows本机用WSL的IP连线到WSL服务
[experimental]
networkingMode=mirrored
hostAddressLoopback=true
然后进入 Linux 发行版编辑 docker 配置文件:/etc/docker/daemon.json,添加:
{
"iptables": false
}
或者直接
echo '{ "iptables": false }' | sudo tee -a /etc/docker/daemon.json
sudo systemctl restart docker
这个方案的缺点是必须停用 Docker 调整 iptables 的功能,否则使用网路镜像模式下,Docker 可能会出现 read: connection reset by peer. 无法连线的错误。
重启 wsl
wsl --shutdown
wsl
WSL 开机运行
如果你想开机运行 WSL (让你的 docker 容器随时可访问),首先查看发行版名称并记下来:
wsl -l --all
Win+R 运行 shell:startup 打开启动目录,创建一个 wsl-startup.vbs 脚本文件,脚本内容如下:
set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl -d Ubuntu-22.04",vbhide
可自行修改 Linux发行版名称(本案例为 Ubuntu-22.04),vbhide 参数为隐藏窗口运行。这样 WSL 的 Linux 发行版就会在开机时就运行。
防火墙设置
# PowerShell
New-NetFirewallRule -DisplayName "Allow MySQL 3306 From LAN And WSL" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3306 -Profile Any
# 删除
Remove-NetFirewallRule -DisplayName "Allow MySQL 3306 From LAN And WSL"
# wsl
nc -vz 192.168.3.61 3306
开发最佳实践
针对 PHP 开发环境,最佳实践是:在 WSL (Ubuntu) 内部部署。
虽然两者都能跑通,但在性能和开发体验上,WSL 方案完胜 PowerShell 方案。以下是详细对比和部署建议:
1. 核心差别对比
| 特性 | PowerShell (Windows 挂载) | WSL (Linux 原生挂载) [推荐] |
|---|---|---|
| 文件 I/O 性能 | 极差。PHP 框架(如 Laravel, FastAdmin)包含成千上万个小文件。Docker 跨系统(从 Linux 容器读写 Windows NTFS 文件)会有巨大的延迟,页面加载可能慢 5-10 倍。 | 极快。容器直接读写 WSL 的 Ext4 文件系统,接近原生 Linux 速度。 |
| 权限管理 | 混乱。Windows 的 ACL 和 Linux 的 chmod/chown 不兼容,容易出现文件不可写或 777 权限满天飞的问题。 | 标准。完全遵循 Linux 权限体系,和线上生产环境一致。 |
| 路径格式 | 复杂。需要处理 C:\Users\... 和 /app 之间的转换。 |
简单。直接使用 /home/user/...,符合 Linux 习惯。 |
2. 为什么选 WSL?
关键点:代码放哪里
黄金法则: 请将你的 PHP 项目代码放在 WSL 的文件系统中(例如 /home/skypc/app),而千万不要放在 Windows 的挂载目录(/mnt/c/Users/...)下。
- ✅ 正确做法: 代码在
\\wsl$\Ubuntu\home\skypc\projects\my-php-site - ❌ 错误做法: 代码在
C:\Users\skypc\projects\my-php-site
3. 开发流程 (VS Code 集成)
既然代码都在 WSL 里,如何在 Windows 上写代码?
-
确保 Windows 安装了 VS Code。
-
在 VS Code 中安装 WSL 扩展 (Microsoft 出品)。
-
在 WSL 终端里,进入你的项目目录,输入
code .。cd ~/projects/my-php-site code . -
VS Code 会打开一个远程窗口,直接编辑 WSL 里的文件。这既享受了 Windows 的 UI 体验,又拥有 Linux 的执行速度。
4. 版本管理
使用 SourceTree 访问 wsl 中的 git 仓库
git config --global --add safe.directory '%(prefix)///wsl$/Ubuntu-22.04/home/skypc/projects/my-php-site'
注意:不是 wsl.localhost。