ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Windows安装Docker完整指南:从WSL 2到容器实战排错

2026/10/2 3:16:41 拓冰建站 浏览量
Windows安装Docker完整指南:从WSL 2到容器实战排错 最近帮几个同事在Windows机器上装Docker几乎每个人都能踩出不一样的坑有人卡在“Docker Desktop failed to start because virtualisation support wasnt 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会非常折腾。检查方式是按WinR输入winver看版本信息即可。第二件事CPU虚拟化是否开启。打开任务管理器切到“性能”选项卡点CPU右下角看“虚拟化”一栏状态必须是“已启用”。如果显示“已禁用”需要进BIOS把虚拟化打开。Intel平台一般是VT-xAMD平台是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(管理员)”。先看系统是否已经装了WSLwsl --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 infodocker 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目录里。日常开发如果经常拉取镜像这个目录会在不知不觉中涨到几十GBC盘红了才想起来迁移已经晚了。迁移动作在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_PASSWORDyourpassword \ -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.ymlversion: 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 wasnt 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配置问题可以进入容器里改DNSdocker 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] memory4GB processors2 swap6GB localhostforwardingtrue保存后执行wsl --shutdown让配置生效。memory设成4GB、processors设成2对日常跑MySQL、Redis和两三个应用服务足够Windows明显流畅很多。这个文件还控制了一些网络转发选项localhostforwardingtrue确保你可以用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裸装一整套服务”的日子了。