ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows下安装Docker完整指南:从WSL 2配置到故障排查

Windows下安装Docker完整指南:从WSL 2配置到故障排查

先交代一个我见过太多次的场景:很多人拿到一台Windows机器,第一反应是去官网下个Docker Desktop安装包,一路Next点到底,然后运行docker version,结果要么报“Docker Desktop requires WSL 2”,要么启动后一直卡在鲸鱼图标转圈,最后不得不重装系统或者翻各种论坛找片段式的解决方法。其实Windows上装Docker并不难,难的是大部分人跳过了前置准备,导致后面每一步都在补坑。这篇教程不做任何多余铺垫,直接讲清楚Windows下装Docker的完整链路:从原理、版本选择、前置环境配置、安装步骤,到安装后的验证方法和常见故障的排查思路,一次性把你需要的都讲完。

1. 为什么Windows上装Docker和Linux差别这么大

1.1 容器本质上是Linux进程,不是普通软件

先理解一个底层事实:Docker容器的运行依赖Linux内核特性,比如命名空间、cgroups、OverlayFS这些机制。容器本身不是一个完整的操作系统,它只是一个加了隔离和限制的Linux进程。你在Linux服务器上装Docker,安装的是Docker引擎,直接调用宿主内核就能跑容器,整个过程很干净。

但Windows没有Linux内核。Windows上的Docker不能直接跑Linux容器,必须在Windows和容器之间加一层轻量级Linux虚拟机。这个虚拟机提供完整的Linux内核,容器跑在虚拟机里,再通过Docker Desktop这个客户端把你敲的命令转发进去。所以Windows版Docker(Docker Desktop)实际上是一个“客户端 + 虚拟机管理器 + 轻量Linux发行版”的组合体,所有你看到的容器、镜像,其实都在那个虚拟机里。

1.2 Docker Desktop的两种后端:WSL 2与Hyper-V怎么选

Docker Desktop在Windows上有两种运行后端:WSL 2和Hyper-V。两种方案本质都是虚拟机,但实现方式和体验差别很大。

WSL 2是微软自己出的Linux子系统方案,基于轻量级虚拟机但集成度极高,启动速度快,内存占用可控,而且和Windows文件系统互通。Docker Desktop默认推荐的也是WSL 2,绝大多数用户直接默认即可。

Hyper-V是Windows自带的完整虚拟化平台,Docker Desktop在很早之前只能依赖它,但Hyper-V要求Windows 10专业版或企业版,且开启后会影响其他虚拟机软件的使用,比如早期版本的VirtualBox、VMware会和它冲突。相比之下WSL 2在Windows 10家庭版上也能用,兼容性更好。

结论很明确:没特殊需求就选WSL 2。只有一种情况你可能需要考虑Hyper-V,就是你本来就在用Hyper-V跑别的虚拟机,不想再套一层WSL 2。从我实际体验看,WSL 2的方案在文件读写、内存回收、启动速度上都更舒服,也是现在社区里最主流的用法。

2. 安装前的系统检查与准备,卡住的大坑集中在这

2.1 先确认CPU虚拟化已经开启

装WSL 2和Hyper-V都依赖CPU虚拟化技术。如果BIOS里没开虚拟化,后面所有步骤都会莫名其妙地失败。最常见的报错是WSL 2启动时报“无法找到适用于此计算机的虚拟化支持”或“请启用虚拟机平台”。

检查方法有两种。最简单的:打开任务管理器,切到“性能”标签,看“虚拟化”那一项是否显示“已启用”。如果显示“已禁用”,需要重启电脑,在开机时按Del或F2进入BIOS设置,找到Intel Virtualization Technology或AMD SVM Mode,改成Enabled,保存退出。

注意一点:有些电脑BIOS里虚拟化选项藏得比较深,不在明显的CPU菜单下,可能在Advanced或Security子菜单里。实在找不到就搜自己主板型号加“Virtualization”关键词,这个环节一定要确认清楚,否则后面排查起来非常浪费时间。

2.2 Windows版本和处理器的判断方法

Docker Desktop对Windows版本有硬性要求:必须Windows 10 64位专业版/企业版/教育版或Windows 11。家庭版严格来说不在官方支持列表里,但只要走WSL 2方案,家庭版也能正常用。Windows 10 2004及更高版本内置了WSL,可以少装一些补丁。

判断方法很简单:按Win + R,输入winver回车,会弹出版本信息窗口,里面有Windows版本号。如果版本号太老,比如1903甚至更早,建议先把系统更新做完再继续,因为旧版本对WSL 2的支持不完整,容易出莫名其妙的问题。

另外一个隐藏条件是内存。Docker Desktop官方建议8GB内存起步,4GB内存跑起来非常吃力,特别是同时开几个容器的时候。如果你机器只有4GB内存,不是不能装,但要做好卡顿的心理准备。我建议至少8GB,16GB体验才叫舒服。

2.3 安装WSL 2的完整流程

WSL 2的安装只需要两条命令。以管理员身份打开PowerShell或Windows Terminal,依次执行:

wsl --install

这条命令会安装WSL 2内核、虚拟机平台组件,并默认安装一个Ubuntu发行版。执行完后按要求重启系统。

重启完成后打开开始菜单,找到并启动Ubuntu,第一次启动会提示设置一个Linux用户名和密码。这一步随便设一个即可,后面Docker容器里和WSL 2发行版交互时会用到。

如果你用的Windows版本较老,不支持wsl --install这种一条命令搞定,就分两步走:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

这两条命令分别是开启Windows Subsystem for Linux功能和虚拟机平台功能,执行完同样要重启。

重启后需要设置WSL 2为默认版本:

wsl --set-default-version 2

再手动安装一个Linux发行版,可以在Microsoft Store里搜索Ubuntu安装。装完启用一次,同样设置用户名密码。

这里我要特别提醒一个细节:很多教程让你装完wsl --install就直接去装Docker Desktop,结果Docker Desktop启动时检测不到WSL发行版。原因就是wsl --install虽然装了Ubuntu,但你没启动过它,WSL服务还没真正初始化。保险起见,装完WSL后先启动一次Ubuntu,随便执行个ls命令确认能进Linux命令行,再回到下一步。

2.4 WSL 2和Hyper-V的取舍细节

如果你机器上已经开了Hyper-V,比如你之前装过Windows沙盒或者用了Docker的老版本,那么WSL 2也可以直接基于Hyper-V平台运行,两者不冲突。但如果你用VMware或VirtualBox跑别的虚拟机,开启Hyper-V会导致这些软件无法使用硬件加速,常常表现为虚拟机启动蓝屏或报错。

所以动手之前先想清楚:这台机器要不要同时跑VMware或VirtualBox?如果需要,建议优先考虑WSL 2方案,并且不要额外开启Hyper-V。Docker Desktop检测到WSL 2时不会强制开启Hyper-V,两者可以明确分开。

我个人的选择是:个人开发机开WSL 2,不开Hyper-V,VMware Workstation照常用(它自带独立内核模块,不需要Windows的Hyper-V);公司统一管控的虚拟机环境则单独评估。这种配置最省心。

3. 下载并安装Docker Desktop,关键选项逐个说

3.1 获取Docker Desktop安装包

Docker Desktop的安装包从Docker官网下载,地址不绕弯子:Docker官网的Products页面下找到Docker Desktop,选择Windows版本下载。下载前最好确认一下你的系统是x86_64还是ARM架构。绝大多数Intel和AMD CPU都是x86_64,直接用默认安装包即可。如果你的电脑是骁龙X Elite这类ARM芯片,记得选ARM版本。

下载完成后是个几百MB的安装包。安装时大概率会让你退出其他程序,尤其是老版本的Docker Toolbox或旧版Docker Desktop,先卸载干净,重启一次再装新的。

3.2 安装向导中真正影响后续使用的选项

安装过程基本是下一步下一步,但有两个选项值得仔细看。

第一是是否使用WSL 2而非Hyper-V。安装向导里有一步“Use WSL 2 instead of Hyper-V on Windows”,这是默认勾选的。除非你有非常明确的理由,否则保持勾选。

第二是是否将Docker Desktop添加到PATH。这个默认勾选,务必保持。它会让你的命令行工具直接识别docker、docker compose这些命令,省去手动配置环境变量的麻烦。装完后如果命令行里提示找不到docker,先检查这一项有没有被意外取消。

其他选项比如创建桌面快捷方式,看个人习惯。安装完成后的操作是先不急着启动,直接重启电脑。这一步是为了让之前装的WSL 2相关驱动和Docker Desktop的组件完成初始化,不重启容易碰到Docker Desktop启动后报错但查不出根因的情况。

3.3 首次启动需要完成的两步配置

重启后打开Docker Desktop,第一次启动会有一个接受服务协议的界面,勾选同意即可。之后它会在后台初始化WSL 2环境,这个过程可能需要1到5分钟,视磁盘和网络情况而定。期间右下角的鲸鱼图标可能会一直转圈或者显示“Docker Desktop is starting”,此时不要反复点击启动,等它自己完成。

初始化完成后,面板左下角会显示“Engine running”,此时进入Settings,在Resources -> WSL Integration里确认你安装的发行版已经开启集成。默认情况下Docker Desktop会自动集成默认WSL发行版,如果你在Ubuntu里跑docker命令发现提示找不到,多半就是这里的开关没打开。

如果启动时提示“WSL 2 installation is incomplete”,说明WSL 2内核没有正确安装。解决办法是在PowerShell里执行wsl --update,然后重启Docker Desktop。这是这个环节最高频的报错。

4. 安装完成后,先跑通这个验证流程

4.1 三步验证命令,判断环境是否健康

Docker Desktop显示“Engine running”不代表一切都好,跑一遍验证命令才能安心。

打开任意一个终端(PowerShell、CMD、Windows Terminal均可),输入:

docker version

正常输出会显示Client和Server两段信息,Server段有Platform: Linux标识,代表服务器端(也就是容器虚拟机)已经正常启动。如果只有Client段而Server段没有显示,大概率是Docker引擎还没启动完,等一两分钟再试。

接着跑:

docker run hello-world

这条命令会把一个测试镜像拉到本地并运行一个容器,容器启动后会打印一段说明文字。看到这段文字就代表容器能正常创建和运行,这是最简单的端到端验证。

最后验证一下WSL集成是否正常。进入你的WSL发行版终端,比如Ubuntu,执行:

docker run hello-world

如果也能正常输出,说明Docker已经从WSL里打通了。日常开发中很多人习惯在WSL里敲docker命令,这就意味着环境完全就绪了。

4.2 命令行工具的位置和宿主路径差异

Docker Desktop本质上是一个GUI壳,命令行的便利性是它最重要的价值之一。安装到PATH后,你在Windows的PowerShell、CMD、以及WSL发行版里都可以直接用docker命令。

这里有个常见的认知误区:在Windows命令行里跑docker run,和在WSL里跑docker run,指向的是同一个Docker引擎,但路径映射规则不同。Windows路径比如C:\project在WSL里会映射到/mnt/c/project,在容器挂载时要注意这个差异。如果你用docker run -v D:/data:/data,Docker Desktop会自动处理Windows盘符转换,但如果你人在WSL里,直接写/mnt/d/data:/data更符合直觉。

此外,Docker Desktop安装后会自动创建一个C:\Users\你的用户名\.docker目录,里面放着配置文件和证书。别乱动,删了会让你重新登录Docker Hub账号以及重新配置环境。

4.3 拉取镜像时特别慢怎么办

国内网络环境下,直接拉官方镜像仓库的镜像经常出现几十KB每秒甚至超时的情况。这不是Docker本身的问题,是网络链路的问题。你的容器镜像和镜像仓库之间隔着千山万水,速度慢是完全正常的。

解决办法是配置镜像加速器。打开Docker Desktop的Settings,切到Docker Engine,在JSON配置里加一行registry-mirrors,填入我常用的国内镜像加速地址。修改后点击Apply & Restart,再拉镜像速度会有质的提升。

如果加速器配置好后拉镜像依然慢,还有个办法:换Docker Hub的镜像源。有些服务商提供代理加速,但链接经常变动,这里就不具体展开了。另外注意一点:加速器只对Docker Hub的公开镜像有效,如果是从其他私有仓库拉取,走的是另一条链路,不受加速器影响。

配置完加速器后,重新执行docker run hello-world,会感觉到明显差异。这个细节虽然和“能不能装”无关,但直接决定了“用起来顺不顺手”。

5. 我踩过和见过最多的五个故障,处理思路一次讲清

5.1 WSL 2版本过旧导致Docker启动失败

这大概是Windows装Docker过程中出现频率最高的问题。现象是Docker Desktop启动后一直显示“starting”或者直接弹窗提示“Docker Desktop requires WSL 2”,但你已经装好WSL 2了。

根因往往是WSL内核版本太旧。微软会在Windows Update之外单独发布WSL内核更新,你装WSL的时间越早,内核越旧,旧内核和Docker Desktop新版组件之间的兼容性可能存在问题。

处理方式很简单,管理员身份打开PowerShell:

wsl --update

更新完重启Docker Desktop。如果你连WSL发行版都没装,wsl --update会提示无法更新,那就先把发行版装上,再更新。

5.2 安装Docker Desktop后启动一直转圈,引擎起不来

引擎一直起不来的场景,90%的原因是WSL 2没有正确初始化,或者发行版损坏。排查思路从wsl --status开始,确认状态。

如果wsl --status显示WSL版本是1或者显示内核版本很旧,说明WSL 2内核没就位。执行wsl --set-default-version 2重新设置默认版本,再wsl --shutdown彻底关闭WSL,重启Docker Desktop。

另一个隐蔽原因是Windows更新后WSL服务被关闭。去服务列表里找到LxssManager服务,确认状态是“正在运行”。如果停止了,右键启动之。这个服务管理所有WSL实例,它挂了Docker自然起不来。

5.3 容器端口在Windows浏览器里访问不了

一个很典型的场景:容器里跑了一个服务,映射端口比如docker run -p 8080:80 nginx,然后在Windows浏览器里访问http://localhost:8080却打不开。

先确认容器本身在运行:docker ps看端口映射是否正常。然后确认是不是本机防火墙拦住了。Windows Defender防火墙对Docker Desktop默认放行,但企业定制系统可能修改了规则。排查时在防火墙高级设置里找到“Docker Backend”或“vpnkit”相关规则,确保允许入站连接。

还有一个隐藏很深的原因:如果Docker Desktop默认使用WSL 2,但WSL发行版的网络配置有问题,会导致localhost映射失效。检查WSL里ip addr看到IP,然后把访问地址改成那个IP试试。如果IP能通而localhost不通,大概率是WSL的端口转发和Windows localhost之间的桥接出了问题,重启系统一般能解决。

这也是为什么我建议开发时绕过这个问题:容器里监听不指定IP(默认是0.0.0.0),端口映射写-p 127.0.0.1:8080:80,强制绑定本机回环地址,能绕开大部分网络配置诡异的情况。

5.4 Docker占用的磁盘空间越来越大,如何清理和减少

Docker Desktop用久了磁盘占用会膨胀到几十GB。常见原因有三个:镜像积累、悬空镜像、构建缓存和日志文件。

清理方式很简单,执行:

docker system prune -a

会把所有未使用的镜像、容器网络、构建缓存全部删掉。这个命令提示时会让你确认,输入y回车。注意:这会删除所有未被运行的容器引用的镜像,多环境并行时慎用。

如果想更精准,用:

docker image prune

只删悬空镜像(即没有标签、没有容器引用的镜像)。构建缓存清理则用:

docker builder prune

嫌命令行麻烦,Docker Desktop的Settings -> Resources -> Disk里也有一个清理按钮,点一下会展示可回收空间。我习惯每个月跑一次docker system prune -a,把不用的镜像和缓存清掉,几十GB的占用能压回个位数。

5.5 WSL 2占内存过多,Docker Desktop怎么限流

WSL 2默认会吃掉最多50%的系统内存,这导致机器只有8GB内存时,Docker Desktop一跑起来整个系统就开始卡。解决办法在Docker Desktop的Settings -> Resources里,把Memory限制为4096MB或2048MB,CPU也可以限制为4核或更少。

这些限制直接作用于WSL 2虚拟机,改完立即生效,不需要重启系统。如果你在许多容器并发构建的场景下觉得慢,再按需调回去即可。

还有一个性能陷阱,就是魔改Docker Desktop占用的CPU。其实除了内存限制,关键还得看磁盘I/O。Windows下Docker的性能瓶颈往往在磁盘,建议把WSL 2的虚拟磁盘放在SSD上,机械硬盘跑容器构建会慢到怀疑人生。

6. 一些长期使用下来的配置建议

6.1 给WSL 2单独配置内存和交换空间

Docker Desktop的Resources配置会控制整体虚拟机的资源,但如果你想在WSL里的Linux发行版中跑更多Linux程序,可以额外调整WSL的全局配置。在C:\Users\你的用户名\.wslconfig文件里写:

[wsl2] memory=6GB swap=4GB processors=4

这个配置针对整个WSL 2运行时,Docker Desktop的Memory限制建议设置得比这个值小,否则WSL 会因为内存不够频繁换页。设置完执行wsl --shutdown,下次启动就生效。

6.2 Docker Desktop的自动启动要不要关

Docker Desktop默认开机自启,对不少人来说很烦。这个在Settings -> General里,有一个“Start Docker Desktop when you log in”选项,取消勾选即可。

但我的建议是保持默认。Docker Desktop启动本来就慢,你要是玩游戏或者只想开个Word,系统里多一个WSL 2后台进程,感觉不明显。但如果你是开发党,每天打开电脑就要敲docker命令,让它自启反而是省事的选择。

6.3 数据目录截断——换个思路:把Docker环境装到D盘

Docker默认的镜像存储位置在C盘,用久了C盘吃紧是家常便饭。Docker Desktop的Disk image location设置可以修改,但很多老版本移动虚拟磁盘文件并不顺利,先关掉Docker Desktop再移动文件才能成功。

因为新版本Docker Desktop在Settings -> Resources -> Advanced里直接有Disk image location选项,点Browse选择路径。但它会迁移整个虚拟磁盘,期间别关机。迁移完原位置文件会自动清理,如果没清理,手动删掉C盘Docker目录的旧文件前先确认新位置能正常启动。

如果不想动虚拟磁盘位置,也可以直接在WSL 2层面解决:把Docker Desktop的数据目录放到其他盘,用符号链接做跳转。步骤有点绕,但效果一致。因为我平时自己开发机的C盘空间充足,所以直接默认即可,只有存储紧张时才会去迁移。

6.4 Docker Desktop的版本更新策略

Docker Desktop经常有新版推送,很多是在后台自动更新的。默认情况下它会自动下载更新,但安装要手动确认。我建议不要用太旧的版本,因为新版本对WSL 2、Windows新版本的兼容性更好,修复了非常多旧版的网络、磁盘问题。

不过自动更新也有坑:有一次Docker Desktop自动升级后,我的容器网络全乱了,排查好久发现是更新后WSL集成设置被重置。后来我养成习惯:升级完Docker Desktop后,进Settings把WSL Integration重新勾选一次,确认各种配置没被重置。大部分升级问题都能规避。

这个习惯和你装Docker时选的WSL方案是一脉相承的:WSL集成是个可关闭的开关,重置概率虽小但确实存在,养成检查习惯,比出事后再排查省事得多。


我实际用了很久Windows版Docker,最大的体会是:不要把它当成一个普通的Windows软件去装,它的本质是一个Linux虚拟化环境的管理工具。先搞清楚WSL 2这个基础,很多看起来诡异的问题都能迎刃而解。按照上面的步骤走,从零开始到跑通docker run hello-world,正常半小时内一定能完成。装完以后记得顺手把镜像加速器配置好,再按需调整内存限制,这套环境用起来才算真正顺手。要是中间卡在某个环节,回头对照第五节排查思路,大部分问题都是那些点。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进