banner
约 1,800 字
6 分钟

没有NAS不要愁!Windows使用WSL安装docker容器体验服务器功能

摘要

本文介绍了在 Windows 11 上安装并配置 WSL 的全过程。首先检查虚拟化并安装 Debian 系统。针对 WSL 命令繁琐的问题,推荐使用 WSL Dashboard 进行可视化管理。随后详细配置了系统环境,包括安装 Docker、国内源、SSH 服务及面板(如 KPanel),并调整网络模式。最后通过防火墙设置实现局域网访问,适合无 NAS/VPS 用户搭建本地服务器。

前言

想体验 Docker 容器的乐趣,但手头既没有 NAS,也没有一台能长期开机的 VPS?其实很多人忽略了一个现成的"服务器"——就是手头这台 Windows 电脑。

前两天我试用了一下微软新发布的 WSLC(WSL for Cloud,新一代容器版 WSL)跑 docker,确实解决了内存占用的问题。但这个应用还处在初级阶段:只能装在 Windows 11 上、不支持可视化面板、也不支持 docker compose,对我来说还不太可用。所以我装回了原版 WSL。(想了解那条新路线可以看这篇:微软原生容器方案 WSLC 实测,两者并不冲突,可以共存。)

WSL 本质上是 Hyper-V 虚拟机,可以跑完整的 Linux 系统,功能没有被阉割。也就是说,你完全可以把它当成一台"常驻的迷你 Linux 服务器"来用:跑 Docker、开服务、做实验,甚至配合内网穿透在公网访问。这篇就把完整流程走一遍。

一、先搞清楚 WSL2 到底是什么

很多人把 WSL 当成"模拟器",这个理解会带来一连串错误判断,先说清楚:

WSL1

WSL2

原理

系统调用翻译层(把 Linux 调用实时翻译成 Windows 调用)

轻量级 Hyper-V 虚拟机,跑一个真实的 Linux 内核

速度

文件 IO 快

文件 IO 略慢(跨系统访问时)

兼容性

差(大量 syscall 未实现)

完整,等于真 Linux

能否跑 Docker

不能

所以"WSL 能不能跑 Docker"这个问题的答案,取决于版本:WSL1 跑不了(缺 syscall + 没有独立内核),WSL2 可以。而正因为 WSL2 是一台真实虚拟机,它才需要 CPU 虚拟化支持 —— 这也直接决定了下一步的前置检查。

顺便解释一个经典抱怨:"为什么 WSL 里编译项目比原生慢?" 因为跨系统访问(在 WSL 里读写 /mnt/c/...)要经过一层文件共享协议,元数据操作(大量小文件 stat)开销特别大。对策很简单:把代码放在 Linux 侧目录(比如 ~/project),而不是留在 /mnt/c/Users/... 下面 —— 性能差异非常明显。

二、前置条件

动手前先确认两件事:

  1. 检查是否开启了虚拟化:打开任务管理器 → 性能,看"虚拟化"是否显示已开启。如果没有,需要重启进 BIOS,找到 Intel VT-x / AMD SVM 之类的选项开启。

blog image

2. 网络:WSL 安装和后续拉取 Linux 系统需要联网。这一步我看到很多小伙伴会遇到问题,但通常需要自己想办法解决(比如检查代理设置),这里就不展开。

三、安装 WSL 和 Debian

  1. Debian 为例,安装 WSL 和对应的 Linux 虚拟机:

纯文本
wsl --install -d Debian --name debian --location c:/wsl/debian
  • --name debian:给这个虚拟机起个名

  • --location c:/wsl/debian:指定它存放的位置(避免默认占满 C 盘) 运行命令后,系统会先安装 WSL,中途会要求你输入新建的用户名和密码,完成后会自动进入这个 Linux 环境。

    blog image
  1. 退出虚拟机,输入 exit

blog image

3. 查看当前有哪些虚拟机,输入 wsl -l

blog image

4. 查看可以安装哪些 Linux 系统,输入 wsl -l -o。除了 Debian,你也可以装 Ubuntu 等其他系统。

blog image

5. 想启动后直接进入用户目录,输入 wsl ~ 即可。

blog image

6. 关闭整个 WSL 虚拟机,用 wsl --shutdown(注意这会把所有发行版都停掉)。 7. 设置虚拟机资源:打开 WSL 的设置面板(新版支持 .wslconfig 或图形设置),可以调整 CPU 数量、内存大小、硬盘大小,按你电脑的实际配置分配即可。

blog image

8. 重点:改网络模式。把网络模式改成 mirrored(镜像),同时勾选"主机地址环回"。这样就能直接用本机的 IP 地址来访问 Docker 容器了,不用再管 WSL 内部的 IP 映射,省很多事。

blog image

9. 删除某个虚拟机(比如 debian),用 wsl --unregister debian。 10. 彻底卸载 WSL,用 wsl --uninstall

关于第 6 步:--shutdown--terminate 的区别

这两个命令经常被混用,但行为不一样:

纯文本
# 停掉某个发行版,但虚拟机本身可能还在
wsl --terminate debian

# 停掉所有发行版 + 关闭整个轻量虚拟机(释放全部内存)
wsl --shutdown

想让 WSL 真正把占用的内存还给 Windows,必须用 --shutdown。但注意:下一次你打开任何 WSL 窗口时它会重新启动(大约几秒),所以"关机前 shutdown 一下"是个不错的省内存习惯。

关于第 7 步:手动写 .wslconfig 限制资源(强烈建议)

设置面板能用,但更推荐直接改配置文件,因为可控项更多、也便于备份。文件位置在 Windows 用户目录下:

纯文本
# 路径(把 <你的用户名> 换成实际的)
C:\Users\<你的用户名>\.wslconfig

内容示例:

纯文本
[wsl2]
# 最多用 8GB 内存
memory=8GB
# 最多用 6 个逻辑处理器
processors=6
# 交换文件大小
swap=4GB

为什么一定要手动限? 因为 WSL2 默认会吃掉宿主机相当大比例的内存(早期是 50%,后续版本最高可到 80%),结果就是"我明明没开什么程序,Windows 却开始卡、浏览器开始崩" —— 这是 WSL 用户最普遍的抱怨,根因就在这里。给它划一条线,两边都舒服。

关于第 8 步:mirrored 网络模式到底改了什么

这一步是体验分水岭,值得说清原理:

  • 旧模式(NAT):WSL 里跑着一个独立的虚拟网卡,有自己的 IP 段(如 172.x.x.x)。后果是 —— 容器端口只监听在 WSL 内部,局域网其它设备访问不到,要用 netsh interface portproxy 手工做端口转发,非常绕

  • 新模式(mirrored):WSL 直接共享宿主机的网络接口和 IP,不再单独建 NAT 网卡。于是容器端口就直接暴露在主机 IP 上,手机、电视、其它电脑都能直接访问localhost 也变成双向可达

代价也有:可能和宿主机上已有程序抢占端口;和某些 VPN、防火墙软件会有冲突。但在"把 WSL 当服务器用"这个场景里,mirrored 是必选项 —— 没有它,你在局域网里根本访问不到容器。

四、可视化:装个 WSL Dashboard

纯命令行的 WSL 要记很多命令,尤其是跑多个发行版时,管理起来有点麻烦——备份、自启动这些功能都要敲复杂的指令。不想记命令的话,可以装这个开源项目 WSL Dashboard。项目地址:https://github.com/owu/wsl-dashboard/

blog image

它支持一键安装、列出、启动、停止、取消注册,并且能从一个地方统一配置你的各个 WSL 发行版,把最麻烦的管理操作都变成了点按钮。

五、把它当服务器用起来

WSL 本质是一个虚拟机里的 Linux 系统,所以照服务器的配置方法设置就可以了。下面列一些必备的基础设置:

  1. 安装 curl 工具

纯文本
sudo -i
apt update
apt install curl -y

blog image

2. 换国内软件源(不然 apt 下载慢):

纯文本
bash <(curl -sSL https://linuxmirrors.cn/main.sh)

blog image

3. 安装 Docker

纯文本
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

blog image

4. 开启 SSH,方便从外面连进来管理:

纯文本
apt update
apt install openssh-server -y
  1. 安装一个面板,让 Linux 操作更顺手。1panel、宝塔都可以,我自己装的是 KPanel

纯文本
bash <(curl -sL kejilion.sh) app kpanel

blog image

6. 如果应用无法从局域网其他设备打开,可能是 Hyper-V 虚拟机的防火墙挡住了。用 PowerShell 管理员权限运行下面的命令,放行默认入站:

纯文本
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow

blog image

第 6 步那条长命令是什么意思? 它修改的是 Hyper-V 虚拟交换机的入站默认策略。WSL2 的流量在 Windows 看来是"来自虚拟网卡"的,会走 Hyper-V 自己的防火墙,而默认策略是"拒绝入站" —— 这就导致"WSL 里服务明明跑着、curl localhost 也通,但局域网其它设备就是连不上"。那条命令把默认入站从"拒绝"改成"允许"。

⚠️ 提醒:这等于把虚拟机的入站全放开了。如果你在 WSL 里还跑着别的服务,请顺手在 Linux 侧用 ufw 再收一道口子,别让 WSL 变成局域网里的"敞门房间"。

六、开机自动启动(当服务器用的关键一步)

WSL 默认不会开机自启,你得手动开个窗口它才起来 —— 这显然不符合"服务器"的定位。两个办法:

① 开启 systemd(推荐,先做这一步)

WSL 默认不启用 systemd,容器/服务无法用 systemctl enable 管理。在 Linux 里创建 /etc/wsl.conf

纯文本
[boot]
systemd=true

保存后执行 wsl --shutdown 再重进,systemctl status 就正常了。之后 nginxdocker 这类服务都能设成开机自启。

② 让 WSL 随 Windows 登录启动

用 Windows「任务计划程序」新建一个任务:

  • 触发器:登录时

  • 操作:启动程序 wsl.exe,参数填 -d debian -u root --exec /bin/true

/bin/true 的用意是"启动虚拟机并立刻退出进程",虚拟机保持运行,但不会弹出窗口。也可以用前面装的 WSL Dashboard 里的自启功能,一键搞定。

七、一个容易踩的坑:磁盘只涨不缩

WSL 的 Linux 文件系统存在一个虚拟磁盘文件里(ext4.vhdx),它是稀疏文件,只增不减

意思是:你把容器、镜像、日志删掉之后,Linux 里显示空间释放了,但 Windows 上那个 vhdx 文件还是原来那么大,C 盘空间并没有回来。这是很多人的困惑来源。

想真正回收空间,两个办法:

纯文本
# 方法一(新版 WSL 自带,推荐):开启稀疏模式,自动回收
wsl --manage debian --set-sparse true

# 方法二(手动压缩,效果最彻底)
wsl --shutdown
# 然后用管理员权限打开 diskpart,依次执行:
#   select vdisk file="C:\wsl\debian\ext4.vhdx"
#   compact vdisk

方法二会让磁盘文件实际缩回真实占用大小,代价是执行时不能有 WSL 在跑。定期做一次,比盲目扩大 C 盘更管用。

小结

走到这一步,你的 WSL 服务器就基本配置完成了,功能相当齐全。配合 WSL Dashboard,开机自启、目录访问这些原本很麻烦的操作都变得很轻松;再配合内网穿透,就能在公网访问跑在本地 WSL 里的应用了。

简单回顾一下关键点:

  • WSL2 是真实虚拟机(所以要开虚拟化),不是模拟器

  • 网络模式选 mirrored,否则局域网访问不了容器

  • .wslconfig 手动限内存,否则拖慢 Windows

  • 开 systemd + 任务计划程序自启,才算真正的"服务器"

  • 定期压缩 vhdx,否则 C 盘只涨不缩

这套方案非常适合没有 NAS 或 VPS 的小伙伴用来学习 Docker、体验自托管,毕竟——你手头这台 Windows 电脑,本身就是一台随时可用的"服务器"。

END