☰
Windows安装Docker完整指南:从WSL 2到容器实战排错
2026/10/2 3:16:40 网站建设 项目流程

最近帮几个同事在Windows机器上装Docker,几乎每个人都能踩出不一样的坑:有人卡在“Docker Desktop failed to start because virtualisation support wasn't detected”,有人在CMD里执行docker命令提示daemon没启动,还有人装完发现镜像全下不动。折腾了一圈下来,我觉得很有必要把Windows上装Docker的完整思路和实操步骤整理成文,从一个踩过坑的人的角度,把前置检查、安装流程、常用配置、容器实战和排错速查表一次说清楚。这篇东西主要适合开发者和运维同学参考,尤其是准备在自己笔记本上把MySQL、Redis、微服务都跑进容器里的人,按步骤走基本能一次装通,省得再去搜索引擎里凑拼图。

1. 安装前先想明白:Windows上的Docker到底是怎么跑起来的

1.1 为什么不是直接安装,而是分后端谈

很多第一次在Windows装Docker的人会有一个疑问:Docker官网给的是Docker Desktop,这玩意儿和Linux上的docker引擎是一回事吗?

先给结论:Docker Desktop本质上是一个图形化的宿主程序,真正执行容器的还是Docker引擎,但引擎跑在一个轻量级虚拟机里。因为Docker容器依赖Linux内核的namespace、cgroup等特性,Windows内核无法原生跑Linux容器,所以只能通过虚拟化来提供Linux环境。

Docker Desktop在Windows上提供了两套后端方案:一套是Hyper-V后端,另一套是WSL 2后端。Hyper-V属于微软自家的虚拟化平台,相当于在Windows里跑了一个完整了虚拟机,再把Docker引擎塞进去;WSL 2则是更轻量的方案,借助“Windows Subsystem for Linux”技术,同样能在Windows上跑一个真实的Linux内核,但它比Hyper-V启动快、资源开销小,和Windows文件系统之间的交互也更友好。

我的建议很简单:新机器一律优先用WSL 2后端。除非你的机器是Win10老版本、或者公司环境里禁用WSL,才考虑Hyper-V方案。后面所有步骤都默认按WSL 2来。

1.2 先查三件事,能避开80%的坑

在动手安装前,先把三件事确认清楚,比装完再排错快得多。

第一件事:操作系统版本。Docker Desktop要求Windows 10 64位专业版/企业版/教育版或者Windows 11。重点注意版本号,Win10必须高于2004(内部版本号19041及以上),太老的版本装WSL 2会非常折腾。检查方式是按Win+R输入winver,看版本信息即可。

第二件事:CPU虚拟化是否开启。打开任务管理器,切到“性能”选项卡,点CPU,右下角看“虚拟化”一栏,状态必须是“已启用”。如果显示“已禁用”,需要进BIOS把虚拟化打开。Intel平台一般是VT-x,AMD平台是SVM Mode,不同主板厂商叫法不一样,有些直接叫“Virtualization Technology”。

第三件事:内存和磁盘余量。内存最低4GB,但真要跑MySQL加Redis加后端服务这套组合,8GB都紧张,我个人建议16GB起步。磁盘方面,Docker Desktop装完至少占用4~5GB,后续镜像还会不断占用空间,C盘空间紧张的话,提前规划好镜像存储目录的迁移方案,后面会专门讲。

1.3 到底该装Docker Desktop还是Docker Toolbox

有个老掉牙的问题得提一嘴:网上有些教程还在推Docker Toolbox。那东西基于VirtualBox,早就被官方放弃维护了,功能老旧,网络兼容性也差。现在去官网下载,一律选Docker Desktop for Windows,别碰Toolbox,别信老教程,踩过坑的人劝你省点时间。

2. 从零到通的完整安装实操:一步一步说清

2.1 开启虚拟化支持

如果前面检查发现CPU虚拟化没开启,这一步就必须做。开机按Del或F2进BIOS(不同品牌电脑按键不同,联想台式机经常是F1,戴尔是F2,华硕是F2或Del,实在不确定就重启时看屏幕提示)。

进入BIOS后,找到“Advanced”或“Configuration”菜单,把Intel Virtualization Technology或SVM Mode设为Enabled,保存退出重启。这一步没有统一路径,但大部分机器都能在这些菜单里找到,耐心翻一下就好。改完回到任务管理器确认虚拟化状态。

注意:部分品牌的笔记本电脑在BIOS里锁了虚拟化选项,这时需要确认BIOS版本是否为最新,或者查询该型号是否有BIOS开关。如果找不到选项,别硬来,先确认CPU型号是否支持虚拟化。

2.2 启用WSL 2

打开PowerShell,注意这次必须以管理员身份运行——右键开始菜单选择“Windows Terminal(管理员)”或“Windows PowerShell(管理员)”。

先看系统是否已经装了WSL:

wsl --status

如果提示没有安装,直接执行:

wsl --install

这条命令会自动安装“适用于Linux的Windows子系统”和“虚拟机平台”两个Windows功能,并默认启用WSL 2,同时装好一个当前默认的Linux发行版(通常是Ubuntu)。如果你用的Win10版本太老,不支持wsl --install,就用传统方式手动开启功能:

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

两条命令跑完后重启系统。重启后,去微软官网下载WSL 2内核更新包(搜索“WSL2 Linux kernel update package”即可),装完再执行:

wsl --set-default-version 2

这条命令的意思是:以后新建的WSL发行版统一用WSL 2,而不是老旧的WSL 1。WSL 1的性能和兼容性差很多,Docker Desktop只推荐WSL 2。到这一步,WSL环境就准备完毕了。

2.3 安装Docker Desktop

从Docker官网下载Docker Desktop for Windows,这个安装包体积大概500MB左右,比较大,耐心等。

双击安装,一路Next,到了“Use WSL 2 instead of Hyper-V”这一步,一定要勾选。这个选项很关键,选了之后Docker Desktop会直接对接WSL 2,不依赖Hyper-V,启动速度更快、内存占用更可控。

安装完成后,首次打开会弹出一个条款确认界面,点击接受即可。如果没有登录Docker账号的强制要求,可以直接跳过登录,不影响本地日常使用。我在实际安装过程中发现,某些版本会要求登录才能继续,注册一个账号也花不了几分钟,但注意登录过程可能比较慢,如果卡住别急。

2.4 第一次启动与基础验证

Docker Desktop启动后,右下角托盘会出现一个鲸鱼图标,等它显示为稳定状态(不再转圈)后,打开PowerShell或CMD,依次执行:

docker version docker info

docker version能看到Client和Server两段信息。Server段能显示出来,说明Docker引擎已经在WSL 2里正常运行了。如果只有Client没有Server,大概率是引擎还没起来或者WSL状态异常。

再跑一个测试容器,验证整个链路是否正常:

docker run hello-world

这条命令会从Docker Hub拉取一个极小的测试镜像并运行。输出Hello from Docker!那一段欢迎语,就说明安装全流程已经通了。

3. 装完别急着用,先做三项关键配置

3.1 配置镜像加速

Docker安装成功只是第一步,真正用得顺手,还得解决镜像下载慢的问题。Docker默认从Docker Hub拉取镜像,国内直连经常几十KB/s,一个几百MB的镜像能下人一小时。

解决方法很直接:配置镜像加速器。打开Docker Desktop的Settings,切到“Docker Engine”标签页,这个页面有一个JSON格式的配置编辑器。把下面的内容贴进去:

{ "registry-mirrors": [ "https://docker.1ms.run", "https://docker.mirrors.ustc.edu.cn" ] }

然后点击“Apply & Restart”,Docker Desktop会带着新配置重启。之后拉取镜像的速度会有明显提升。

提示:镜像加速器属于第三方公共服务,稳定性随网络环境波动。如果发现某个地址拉不动,换一组地址即可。拉取失败时,可以先执行docker info查看Registry Mirrors一栏是否已经生效。

3.2 把镜像存储目录挪出C盘

默认情况下,Docker Desktop把镜像文件存放在C盘的%LOCALAPPDATA%\Docker\wsl目录里。日常开发如果经常拉取镜像,这个目录会在不知不觉中涨到几十GB,C盘红了才想起来迁移,已经晚了。

迁移动作在Settings的“Resources”选项卡里,有一个“Disk image location”,点“Browse”选择一个新目录,然后Apply & Restart。Docker Desktop会把现有镜像数据一并迁移过去。这个操作对已有容器会有一点中断,建议在不需要跑容器的时候做。

如果你用的是WSL 2后端,容器存储其实对应的是Docker Desktop创建的WSL发行版,所以也可以使用.wslconfig文件来限定磁盘大小,后面讲性能优化时会提。

3.3 权限和PATH环境变量问题

Docker Desktop装完,默认会自动把docker.exe、kubectl.exe等命令加入系统PATH。如果执行docker提示“不是内部或外部命令”,通常是因为安装完成后没有注销重新登录,环境变量没有刷新。注销重进一次基本解决。

另外有一个很典型的报错,网上问的人特别多:error: start the windows daemon from a non-elevated terminal; shared clients...,这个问题常见在用户用管理员终端启动了Docker Desktop,然后又在普通终端执行docker命令,两边权限不对等。我的一贯做法是:日常使用统一用普通终端,不要用“以管理员身份运行”的方式来配合Docker Desktop,这样能避免一堆莫名其妙的权限问题。这一点放到排错清单里详细讲。

4. 实战演练:在Windows容器环境里跑MySQL 8.0和Redis主从

4.1 用docker run快速启动MySQL 8.0

装好Docker之后,最想干的事大概率是先跑个数据库。以MySQL 8.0为例,一条命令就能起一个能用的实例:

docker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -v mysql_data:/var/lib/mysql \ mysql:8.0

逐参数解释一下:-d表示后台运行;--name mysql8给容器起名;-p 3306:3306把宿主机的3306端口映射到容器内的3306端口,这样Windows本地的Navicat、DataGrip就能直接用localhost:3306连接;-e MYSQL_ROOT_PASSWORD设置root密码;-v mysql_data:/var/lib/mysql是关键,它创建了一个名为mysql_data的数据卷,把MySQL的数据文件持久化到宿主机,容器删了数据也不丢。

启动后验证:

docker ps docker exec -it mysql8 mysql -uroot -p

输入密码后能进MySQL命令行,就说明环境通了。

这里有个高频坑:如果你之前已经在Windows上装过MySQL服务,这个-p 3306:3306会启动失败,提示端口占用。处理思路是先查端口被谁占用:

netstat -ano | findstr 3306

最后一列是占用进程的PID,再用tasklist | findstr <PID>查出是哪个程序,最后要么停掉旧服务,要么给容器换宿主机端口,比如-p 3307:3306,不折腾。

4.2 一键拉起Redis主从:用docker compose更省心

单容器用docker run没问题,但一旦涉及多个实例、多个服务之间的依赖关系,手敲命令就很容易乱。这里我用Redis主从架构做一个演示——用docker compose编排,几行YAML描述一切。

先建一个目录,比如C:\redis-cluster,在里面新建一个docker-compose.yml:

version: "3.8" services: redis-master: image: redis:7.0 container_name: redis-master restart: always ports: - "6379:6379" command: redis-server --appendonly yes redis-replica: image: redis:7.0 container_name: redis-replica restart: always ports: - "6380:6379" depends_on: - redis-master command: redis-server --replicaof redis-master 6379

然后在目录里执行:

docker compose up -d

等待镜像拉取完成后,验证主从关系:

docker exec -it redis-master redis-cli info replication

看输出里role:master表示主库正常;再验证从库:

docker exec -it redis-replica redis-cli info replication

输出里role:slave且master_host:redis-master,说明主从已经连接成功。这个compose文件里,depends_on控制启动顺序,redis-server --replicaof redis-master 6379是Redis内部通过主机名发现主库的方式——容器网络里,服务名本身就是可解析的域名,这是compose编排优于纯docker run的一个重要原因。

4.3 本地微服务项目为什么值得迁移到容器里

跑通MySQL和Redis后,很多同学会趁热打铁,问能不能把本地微服务项目也容器化。我的回答是:非常值得,而且越早迁移越省事。

举个例子,一个后端接口项目依赖MySQL、Redis、Nginx静态资源和一个Java/Node服务,以前在Windows上本地开发,得分别安装这些软件,版本一多就乱了。用docker compose可以把整套环境定义成代码:

services: nginx: image: nginx:latest ports: - "80:80" volumes: - ./html:/usr/share/nginx/html api: build: ./backend ports: - "8080:8080" depends_on: - mysql8 - redis-master

团队里任何一个人拿到这个文件,执行docker compose up -d,就能得到和CI环境一致的运行环境。“得而复失的环境一致性”是容器化最大的价值点。Windows上开发、Linux上生产造成的行为差异,也会因为容器这一层被填平。

5. 常见问题排查实录:照着这张表抄就行

5.1 Docker Desktop无法启动,提示虚拟化缺失

这个报错出现率极高,完整的提示是:

Docker Desktop failed to start because virtualisation support wasn't detected.

原因分几类:BIOS虚拟化未开启(前面检查过了)、Win10版本太老导致虚拟机平台功能不可用、或者电脑上安装了第三方虚拟化软件产生了冲突。

排查步骤按顺序走:先回任务管理器确认CPU虚拟化已启用;然后以管理员身份执行wsl --status确认WSL可用;最后检查“Windows功能”里“适用于Linux的Windows子系统”和“虚拟机平台”是否都勾选了。如果都正常但仍无法启动,可以试试清理重启Docker Desktop的WSL数据:

wsl --shutdown

然后再启动Docker Desktop,这个方法能解决相当一部分WSL状态卡死的问题。

5.2 非管理员终端启动daemon的共享报错

error: start the windows daemon from a non-elevated terminal; shared clients...这串报错,实际上一半以上是使用姿势问题。Docker Desktop启动后,后台服务使用当前用户的上下文,如果你一会儿用管理员终端执行docker命令,一会儿用普通终端执行,两者权限对不上,客户端就无法连接daemon。

处理方案很简单:退出所有管理员权限的终端,统一换回普通PowerShell;如果还不行,右下角托盘右键Docker Desktop选“Quit”,再重新启动一次。记住一个原则,Windows上日常使用Docker命令时不要开管理员权限,反而是在安装WSL和做系统功能变更时才需要管理员。

5.3 容器网络不通、localhost访问不了

常见的网络故障有两种。一种是容器内部可以联网,但Windows宿主机访问localhost:3306连不上,这种情况先确认端口映射是否配置了-p参数;另一种是容器内执行curl外网域名超时,大概率是WSL 2的DNS配置问题,可以进入容器里改DNS:

docker exec -it api bash echo "nameserver 8.8.8.8" > /etc/resolv.conf

但这种方式重启容器会被覆盖,更好的做法是在docker run时加--dns参数指定DNS,或者在compose文件的service里加dns:列表。还有一个经常被忽略的盲区:Windows防火墙会把WSL虚拟网卡和容器子网的流量拦掉,如果网络测试一直不通,去防火墙的“高级设置”里给Docker相关的应用放行,或者临时关闭防火墙验证一次,确认真凶。

5.4 资源占用过高,Windows越来越卡

WSL 2本质上是一个轻量虚拟机,它默认会占用大量内存和CPU资源。如果Docker Desktop常开着,Windows会变得迟钝。解决办法是创建一个C:\Users\<用户名>\.wslconfig文件,限制WSL 2的资源:

[wsl2] memory=4GB processors=2 swap=6GB localhostforwarding=true

保存后执行wsl --shutdown让配置生效。memory设成4GB、processors设成2,对日常跑MySQL、Redis和两三个应用服务足够,Windows明显流畅很多。这个文件还控制了一些网络转发选项,localhostforwarding=true确保你可以用localhost访问容器端口。

5.5 镜像拉不下来的其他原因

确认镜像加速器已经配上后,如果还是拉不下来,检查一下DNS设置,以及是否有企业内部网络代理干扰。Docker Desktop的Settings里有“Proxies”配置页,如果你的网络环境需要代理,在这里配置好后重启。另外,部分镜像源只走HTTPS,如果配了HTTP的镜像地址,也会导致拉取时握手失败。最省心的办法是换一个当前可用的加速地址,多试几个。

5.6 彻底卸载重装的分寸感

有时候问题累积到一定程度,实在找不到根因,重装比继续折腾更有效率。彻底卸载时,除了在“应用”里卸载Docker Desktop,还要清理几个目录:%AppData%\Docker、%LocalAppData%\Docker、%ProgramData%\Docker,以及WSL中的docker-desktop发行版数据(在普通PowerShell里执行wsl --list查看,先wsl --unregister docker-desktop和wsl --unregister docker-desktop-data再卸载重装)。清理干净后再重新安装,很多疑难杂症会直接消失。这一手算是我多次“救自己于水火”的操作,建议收藏备用。

6. 最后分享一点个人使用体会

Windows上安装Docker这件事,难度不在“安装”本身,而在于对底层机制的理解。很多人失败是因为不知道“Windows跑的Docker引擎其实在Linux环境里”,于是遇到报错只会盲试网上的命令,越试越乱。我在实际使用中最大的体会是:Docker Desktop只是入口,真正决定稳定性的,是WSL 2的健康状态和宿主机的资源规划。遇到卡顿、网络异常、启动失败,先执行wsl --shutdown,再重新拉起Docker Desktop,这个动作能解决的问题比你想象的多。另外,如果你日常主力机就是Windows,建议把所有数据库、缓存、中间件都交给Docker管理,宿主机保持纯净,项目换机器时只需要把compose文件带过去,跑起来就是一模一样的环境。这套玩法跑顺之后,你会发现自己再也回不到“在Windows裸装一整套服务”的日子了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询