很多刚接触容器技术的开发者可能不知道,Windows 11家庭版默认是不支持Hyper-V的,这给Docker环境部署带来了第一个门槛。不过别担心,我们可以通过手动安装的方式解决这个问题。我刚开始用Windows 11家庭版时也踩过这个坑,折腾了半天才发现问题所在。
首先需要创建一个Hyper-V.cmd文件,把以下代码复制进去:
bash复制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"重启电脑。这个操作相当于给系统打补丁,让家庭版也能用上专业版才有的Hyper-V功能。重启后还需要执行一个命令来确保Hyper-V能自动启动:
bash复制bcdedit /set hypervisorlaunchtype auto
接下来要检查虚拟化是否开启。我遇到过好几次因为没开虚拟化导致WSL2无法正常工作的情况。按Ctrl+Alt+Delete打开任务管理器,切换到"性能"标签页,查看CPU部分的"虚拟化"是否显示"已启用"。如果没有,就需要进BIOS设置。不同品牌的电脑进入BIOS的方式不太一样,一般是开机时按F2、F12或Delete键。
在BIOS中找到虚拟化相关选项(可能叫Intel VT-x、AMD-V或Virtualization Technology等),把它设为Enabled。保存设置后重启电脑,再确认虚拟化已经开启。这一步很关键,我帮不少朋友排查问题时发现,90%的WSL2启动失败都是因为没开虚拟化。
最后还要启用几个Windows功能。打开控制面板→程序→启用或关闭Windows功能,勾选:
勾选完记得重启电脑。这些组件是WSL2和Docker运行的基础,缺一不可。我建议按顺序一个个来,避免一次性改太多设置导致问题难以排查。
WSL2是微软推出的Linux子系统,相比第一代性能提升明显,特别是文件IO方面。安装前建议先更新系统到最新版本,我在20H2版本上遇到过不少兼容性问题,更新后都解决了。
以管理员身份打开PowerShell,先设置默认版本:
bash复制wsl --set-default-version 2
然后查看可安装的Linux发行版:
bash复制wsl --list --online
选择Ubuntu 22.04安装:
bash复制wsl --install -d Ubuntu-22.04
这里有个常见坑点:可能会卡在下载环节。因为默认的GitHub源在国内访问不太稳定。我试过几种解决方案:
安装过程中会提示设置用户名和密码,这个密码要记住,后续sudo操作会用到。安装完成后,建议先执行系统更新:
bash复制sudo apt update && sudo apt upgrade -y
WSL2默认会把虚拟机文件放在C盘,时间久了可能会占用大量空间。我习惯把它迁移到其他分区。先关闭WSL:
bash复制wsl --shutdown
然后导出当前系统:
bash复制wsl --export Ubuntu-22.04 D:\Ubuntu-22.04.tar
注销原系统:
bash复制wsl --unregister Ubuntu-22.04
最后导入到新位置:
bash复制wsl --import Ubuntu-22.04 D:\Ubuntu_WSL D:\Ubuntu-22.04.tar
迁移完成后还需要设置默认用户,否则会以root身份登录:
bash复制Ubuntu2204 config --default-user 你的用户名
Docker官网提供了Windows版安装包,但直接安装可能会遇到两个问题:默认安装路径在C盘,以及国内镜像拉取慢。我的经验是自定义安装路径,方便后续管理。
下载完安装包后,在命令行执行:
bash复制start /w "" "Docker Desktop Installer.exe" install --installation-dir=D:\Docker
安装完成后,第一次启动会提示需要启用WSL2集成。在设置→Resources→WSL Integration中,勾选我们安装的Ubuntu发行版。这一步很关键,我之前没注意,结果Docker命令只能在PowerShell用,WSL里用不了。
Docker默认会创建一个虚拟磁盘存储镜像和容器,这个文件默认也在C盘。可以在设置→Resources→Advanced中修改磁盘镜像位置。我把它放到了D盘,节省C盘空间。
国内用户还需要配置镜像加速。在设置→Docker Engine中添加以下配置:
json复制{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
配置完成后点击"Apply & Restart"。我测试过这几个镜像源,中科大的速度相对稳定。如果某个源不可用,可以暂时禁用它。
安装完成后,建议运行一个测试容器验证环境是否正常:
bash复制docker run hello-world
如果看到欢迎信息,说明安装成功。我还会进一步测试更复杂的场景,比如构建一个简单的Node.js应用:
bash复制docker run -it node:16-alpine sh
在容器内执行node -v,确认环境正常。这些测试能发现一些潜在问题,比如网络连接或存储挂载是否正常。
日常使用中有几个实用技巧:
对于开发者来说,建议把项目代码放在WSL文件系统中,这样在Windows和Linux环境都能访问。我习惯在D盘创建Projects目录,然后在WSL中通过/mnt/d/Projects访问。
调试时如果遇到问题,可以查看Docker日志:
bash复制docker logs 容器ID
或者检查WSL状态:
bash复制wsl --list --verbose
这些命令能帮助快速定位问题。我刚开始用时经常遇到容器莫名退出的情况,后来发现是端口冲突,用docker logs才找到原因。
在实际使用中,有几个常见问题需要注意。首先是网络问题,我在公司网络下遇到过Docker无法拉取镜像的情况,解决方法是在Docker设置中配置HTTP代理。
另一个常见问题是WSL2的IP地址会变化,导致本地开发时经常要改配置。解决方案是使用host网络模式,或者在代码中使用服务名而非IP地址。
性能方面,WSL2的文件系统性能比原生Linux差不少。我的经验是:
内存使用也是个需要注意的点。WSL2默认会占用最多50%的物理内存,对于16GB内存的电脑来说有点多。可以在用户目录下创建.wslconfig文件:
ini复制[wsl2]
memory=4GB
swap=2GB
这样就把内存限制在了4GB。根据我的经验,普通开发4GB足够用,跑大型应用时可以适当调大。
最后提醒一点,WSL2和Docker Desktop会随着系统启动自动运行。如果不需要常驻,可以在任务管理器→启动应用中禁用它们,需要时再手动打开,这样可以节省系统资源。