ARTICLE DETAIL

建站实战干货

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

Windows 10安装Docker Desktop实战:从WSL2配置到MySQL容器

2026/9/12 23:26:29 拓冰建站 浏览量
Windows 10安装Docker Desktop实战:从WSL2配置到MySQL容器 这两年我不下十次被朋友问到同一句话Docker到底怎么在Windows 10上装每次我给他们发官方文档收到的回复基本都是看不懂或者装了还是报错。确实Docker在Windows上的安装不像Linux那样一条命令搞定它牵扯到虚拟化、WSL2、Hyper-V、系统版本、BIOS设置等等一堆前置条件任何一个环节没对上安装完的Docker Desktop就会以各种姿势罢工。这篇文章就把我的实操经验完整梳理一遍。我会从Windows跑Docker的底层原理讲起把安装前需要检查的环境项、Docker Desktop的安装配置、镜像加速、第一个容器实战以MySQL 8.0为例全部走一遍最后把最常见的启动报错和排查思路整理出来。无论你是学生、运维、后端开发还是只是想把Redis、MySQL、GitLab这类服务跑在本机上这篇文章都能帮你少走很多弯路。1. Windows上跑Docker必须搞明白的那道坎1.1 容器为什么在Windows上水土不服很多人都知道Docker容器比虚拟机轻量、启动快、资源占用小。但很少有人去追问一句为什么Docker在Windows上安装这么费劲这得从Docker的技术底座说起。Docker本身并不是一个虚拟机软件它依赖Linux内核提供的一系列特性来实现隔离比如namespace命名空间负责隔离进程、网络、文件系统cgroup控制组负责限制CPU、内存等资源的使用。Linux容器之所以轻量是因为所有容器共享同一个Linux内核不需要为每个容器模拟一整套操作系统。然而Windows的内核跟Linux内核完全是两码事Windows进程无法直接跑在Linux内核上反过来也一样。所以在Windows上安装Docker本质上面临的问题是Docker引擎需要Linux内核而Windows没有。这就迫使Docker Desktop在Windows上必须引入一个轻量级虚拟机在里面跑一个真正的Linux内核Docker引擎跑在这个虚拟机的Linux内核之上然后容器再共用这个Linux内核。这也就是为什么安装Docker Desktop的电脑必须支持并开启硬件虚拟化功能比如Intel的VT-x或者AMD的V。没有这个硬件辅助轻量级虚拟机就跑不起来Docker自然也就无法工作。1.2 WSL2和Hyper-V两条路到底怎么选早期Docker Desktop在Windows上只能选择基于Hyper-V的虚拟化方案。Hyper-V是微软自家的虚拟机监控程序功能很完整但它在Windows 10家庭版上不可用而很多个人用户的电脑恰恰就是家庭版系统这是当年的第一道门槛。后来微软推出了WSL2Windows Subsystem for Linux 2本质上是微软自己实现的一个轻量级虚拟机专门用于在Windows里运行Linux子系统。WSL2不是传统意义上的完整虚拟机它跟Windows主机共享内核调度启动速度比Hyper-V快很多资源占用也更小。Docker Desktop随之支持了基于WSL2的后端模式。我给你的选型建议是只要能装WSL2就优先用WSL2模式。原因我列个表一看就懂。对比项WSL2后端Hyper-V后端系统版本要求Windows 10 2004及以上家庭版也可用Windows 10专业版/企业版/教育版启动速度秒级相对较慢内存占用按需动态分配固定预留较多与Windows文件互访通过\wsl$\路径直接访问方便需要通过配置或共享文件夹版本回退可切换回WSL1或Hyper-V切换麻烦综合推荐度首选仅在无法用WSL2时考虑顺便说一句WSL2跟VMware、VirtualBox这类第三方虚拟机软件在同时使用时可能会产生虚拟化层的冲突。如果你电脑上装了VMware装Docker之前最好先想清楚后端方案否则可能启动时直接报虚拟化被占用的错误。这个细节后面第5章还会详细展开。2. 安装前的环境体检先别急着下载安装包很多人兴致勃勃下载了Docker Desktop安装包结果双击安装完一启动就报错然后就卡住了。其实80%的启动失败都能在安装前通过几分钟的环境检查规避掉。这一节我把三个关键检查项按顺序讲清楚。2.1 BIOS里的虚拟化开关Docker Desktop启动失败时有一条非常经典的报错virtualization support not detected意思是检测不到虚拟化支持。遇到这个报错第一反应不是重装Docker而是进BIOS确认虚拟化开关是否打开。不同品牌的电脑BIOS界面不太一样但大体的路径是开机时按F2、F10、Del之类的按键进入BIOS设置找到Intel Virtualization TechnologyIntel平台或者SVM ModeAMD平台把它设为Enabled保存退出重启。有个细节容易被忽略有些笔记本BIOS里虚拟化选项藏得比较深可能在Advanced或者Processor子菜单下面。还有些品牌机默认会禁用虚拟化甚至部分电脑的虚拟化开关被锁定需要先设置BIOS密码才能修改。判断电脑硬件虚拟化是否已启用最简单的方法是打开任务管理器切到性能选项卡点击CPU看右下角有没有虚拟化已启用这一行。如果显示已禁用别急着装Docker先把BIOS里那项找到并打开再说。虚拟化已启用只有看到这个状态才说明硬件层面的条件已经满足。2.2 Windows功能组件与版本核对第二步是确认Windows 10的版本。按WinR打开运行窗口输入winver回车会弹出版本信息对话框。这里有两个关键点版本号必须不低于2004也就是20H1及更新的版本WSL2在旧版Windows 10上要么不可用要么配置起来极其费劲。系统版本决定了你能用哪种后端。家庭版不支持Hyper-V但支持WSL2所以家庭版用户老老实实走WSL2路线。接下来需要开启两个Windows功能适用于Linux的Windows子系统和虚拟机平台。操作路径是控制面板 - 程序 - 启用或关闭Windows功能在弹出的窗口里把这两项勾上点确定系统会提示重启电脑。这里我多说一句很多人勾选时习惯性地只勾适用于Linux的Windows子系统结果漏了虚拟机平台。这两个功能在WSL2模式下缺一不可漏掉任何一个WSL2都无法正常工作Docker Desktop启动时大概率会卡在初始化阶段。2.3 WSL2内核更新包很多人漏掉的必装项开启Windows功能并重启后下一步是安装WSL2的内核更新包。这一步官方文档里写得很清楚但实际交流中发现不少人会跳过。你需要前往微软官网下载wsl_update_x64.msi这个安装包下载后双击安装即可。安装完成后打开PowerShell或命令提示符执行wsl --set-default-version 2如果命令执行成功会提示有关信息有关 WSL 2 的主要区别的信息请访问...这说明WSL2已被设置为默认架构。有一个判断WSL2是否配置成功的小技巧执行wsl -l -v命令如果显示了发行版列表且VERSION列是2说明WSL2正常。如果这里什么输出都没有说明你还没有安装任何WSL发行版也没关系Docker Desktop在安装过程中会自动处理一个专用的WSL发行版但你最好先手动跑到这一步确认内核包没问题。提示如果你执行wsl --set-default-version 2时报错WSL 2 需要更新其内核组件基本就是内核更新包没装或者没装成功重新安装wsl_update_x64.msi后再试。3. Docker Desktop安装实践与镜像加速器配置环境项全绿之后安装Docker Desktop本身反而没什么难度了。但安装完成后的配置环节有几个坑我一个个拆开说。3.1 下载安装与关键勾选项去Docker官网下载Docker Desktop for Windows安装包。下载时注意区分CPU架构绝大多数人是x64平台选对应版本即可。双击安装包进入安装界面后有一个关键勾选项需要留意使用WSL 2而不是Hyper-V。这个选项默认是勾上的建议保持勾选除非你明确知道自己需要用Hyper-V模式。还有一个容易被忽略的问题安装完成后是否立即启动Docker Desktop。我建议先不要立即启动等我把下面第3.3节的镜像加速器配置做完再启动这样能避免第一次启动时因为拉取某些基础组件超时而卡住。登录账号这一步可以跳过。Docker Desktop现在会提示你登录Docker Hub账户不登录也能正常使用核心功能只是拉取镜像会有匿名用户的速率限制。等后面需要推送镜像到Docker Hub时再登录也不迟。3.2 首次启动后的基础设置第一次启动Docker Desktop时它会自动完成WSL后端初始化这个过程可能需要一两分钟。启动完成后右下角任务栏会出现Docker的鲸鱼图标。点开主界面进入Settings菜单有几个地方值得按照你的实际需求调一下。首先是General里的Start Docker Desktop when you sign in。如果电脑配置一般、平时也不天天用Docker我建议取消勾选改成手动启动否则每次开机Docker都会默默吃掉一部分内存。然后是Resources - Advanced。这里可以调整Docker可用的CPU和内存上限。默认设置是CPU全给、内存按比例分配。如果你只是跑一两个容器做开发测试给4GB内存就绰绰有余了不用让它占满整个机器的内存。改完配置后点Apply Restart生效。最后是Resources - WSL Integration。如果你装了多个WSL发行版需要在这里勾选想让Docker集成的发行版。默认只有Docker Desktop自带的那个发行版被勾选保持默认即可。3.3 镜像加速器配置告别拉取超时用Docker就绕不开从镜像仓库拉取镜像这个操作。默认情况下Docker会从Docker Hub官方仓库拉取镜像但对于国内网络环境来说直接连Docker Hub经常会出现拉取超时、连接被重置这类问题很多新手在这一步就放弃了。解决方案是配置镜像加速器。打开Docker Desktop的Settings找到Docker Engine选项卡在这里会看到一个JSON格式的配置项。在registry-mirrors字段中加入镜像加速地址保存后点Apply Restart让配置生效。{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com ] }选择镜像加速地址时要注意几点不要填写来历不明的第三方地址优先使用有正式备案和长期维护的公共镜像服务多个地址可以同时配置Docker会按顺序尝试拉取第一个挂了会自动尝试第二个。配置完成后可以执行docker info命令在输出中找到Registry Mirrors那一行如果列出了你配置的地址说明加速器已经生效。注意配置加速器只能解决镜像拉取的问题。容器运行时如果需要访问外网资源那是另一回事别混淆了。4. 第一个容器实战用Docker跑MySQL 8.0试水环境搭建好以后不跑一个真实项目总觉得心里没底。这一节我选择一个最常见的场景——在Docker里跑MySQL 8.0把整个操作链路走一遍。跑通这个例子Docker的基本工作流你也就掌握了。4.1 docker run命令参数的逐一拆解打开PowerShell或Windows Terminal执行下面这条命令docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e TZAsia/Shanghai \ -v D:/docker-data/mysql8:/var/lib/mysql \ mysql:8.0第一次执行时会先拉取镜像配置了加速器之后拉取速度应该比较快。拉取完成后容器会自动启动。我来逐条解释每个参数是干什么的理解这些参数之后其他容器你基本也就会跑了。参数作用为什么需要-d后台运行容器不加的话终端会被容器的日志输出占住--name mysql8给容器命名后面用docker stop mysql8操作时不用记容器ID-p 3306:3306端口映射宿主机3306端口转发到容器3306端口宿主机上的客户端工具如Navicat通过localhost:3306访问容器内的MySQL-e MYSQL_ROOT_PASSWORD123456设置环境变量MySQL官方镜像用这个变量初始化root密码-e TZAsia/Shanghai设置容器时区不设置的话容器默认是UTC时区时间会比北京时间晚8小时-v D:/docker-data/mysql8:/var/lib/mysql数据卷挂载宿主机目录映射到容器目录MySQL数据实落盘在D盘删容器不丢数据这里我要特别强调-v参数。MySQL容器如果删除了容器内部的数据也会一并消失除非你把数据目录挂载到宿主机。这就是为什么生产环境部署任何有状态服务MySQL、Redis、PostgreSQL时数据卷挂载是必需品而不是可选项。4.2 Windows路径与容器路径的挂载技巧关于-v参数有个Windows特有的坑路径写法。WSL2模式下Docker Desktop的路径映射规则跟Windows原生路径不太一样。理论上D:/docker-data/mysql8这种写法在Windows命令提示符或PowerShell下用是没问题的Docker Desktop会自动帮你转换。但如果你在WSL终端里执行docker命令路径就要写成Linux风格的/mnt/d/docker-data/mysql8。为了避免路径写错我的习惯是往Docker的-v参数里写路径时统一先在Windows文件资源管理器里创建好目标目录然后用绝对路径。目录不存在时Docker会自动创建但权限可能会有点怪特别是跟权限有关的应用。此外还有一个容易踩的坑Docker Desktop对于Windows路径中的盘符大写小写不敏感不会因为d:和D:的差异出问题。但Windows OneDrive同步目录、中文路径、带空格的路径都可能引发不可预知的挂载问题。稳妥起见所有挂载目录都不要放在OneDrive或带中文/空格的路径下。4.3 验证MySQL容器是否真正可用容器启动后依次执行下面几个命令验证状态docker ps这条命令会列出所有运行中的容器。如果mysql8出现在列表里STATUS列是Up说明容器运行正常。docker logs mysql8查看日志。MySQL初始化过程中会输出大量日志看到最后出现类似ready for connections的语句说明数据库已经就绪。docker exec -it mysql8 mysql -uroot -p直接进入容器内部执行MySQL客户端。输入密码就是上面环境变量里设置的123456出现mysql提示符就大功告成了。外面用Navicat、DBeaver这类GUI工具连接也验证一下主机填127.0.0.1端口3306用户名root密码就是你设置的那个。能连上就说明端口映射和网络链路都是通的。4.4 容器生命周期管理别怕删容器很多新手第一次用Docker时不敢删容器总觉得容器是个很重的实体。其实容器本身是临时的命令跟虚拟机完全不一样。docker stop mysql8 # 停止容器 docker start mysql8 # 启动已停止的容器 docker restart mysql8 # 重启容器 docker rm mysql8 # 删除容器数据还在因为挂载了数据卷 docker rmi mysql:8.0 # 删除镜像重点理解docker rm删除的是容器本身不是数据。数据在数据卷里也就是当初-v指定的宿主机目录D:/docker-data/mysql8里。只要这个目录还在重新执行一次docker run命令MySQL的数据就原封不动地回来了。这一点跟虚拟机有着本质区别。虚拟机删了虚拟磁盘文件里的数据就没了Docker配合数据卷容器可以随意替换、重装、升级数据始终安全。理解了这层关系你就掌握了Docker使用的核心心法。5. 启动失败与运行异常的排查思路即便准备工作做足了实际使用Docker Desktop时还是会遇到各种问题。这一节我把我真实遇到过的、以及社群中被问得最多的几类问题整理成排查手册。不像网上那些零散的问答我把完整的排查链路都写出来。5.1 Virtualization support not detected的完整排查链路这是Docker Desktop在Windows上最常见的启动报错没有之一。遇到这个错误按下面的顺序逐项检查。第一步任务管理器确认虚拟化状态。打开任务管理器 - 性能 - CPU看右下角虚拟化行。如果显示已禁用直接跳转到第二步如果显示已启用但你依然收到这个报错则跳转到第三步。第二步进BIOS开启VT-x/SVM。这一步前面第2.1节已经讲过这里不再重复。第三步检查第三方虚拟化软件冲突。这一步是最多人忽略的。VMware Workstation、VirtualBox这类软件会占用虚拟化层有时会导致Docker Desktop的虚拟化检测失败。解决方案是关掉这些软件再启动Docker Desktop试试。第四步检查Windows功能里的Hyper-V组件状态。有时候Hyper-V相关的功能处于半开半关的状态也会干扰虚拟化检测。在管理员权限的PowerShell里执行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All执行后重启再启动Docker Desktop。第五步仍然不行的话用管理员权限PowerShell执行bcdedit命令检查Hypervisor是否已启动bcdedit /set hypervisorlaunchtype auto如果之前安装过某些虚拟机工具把hypervisor启动类型改成了off这条命令能把它改回来。改完重启生效。5.2 WSL2相关的内核错误Docker Desktop在WSL2模式下启动时有两条常见的报错信息WSL 2 requires an update to its kernel componentThe WSL 2 kernel version is too old这两条本质上是同一个问题WSL2内核组件缺失或版本过旧。解决方案是重新安装wsl_update_x64.msi。安装完以后在PowerShell里执行wsl --update wsl --shutdownwsl --shutdown会彻底关闭所有WSL虚拟机然后重新启动Docker Desktop。这个组合拳能解决绝大多数WSL2内核相关的疑难杂症。补充一个细节wsl --update需要Windows 10 2004及以上版本才能使用。如果你的系统版本过旧wsl命令可能根本不认识--update这个参数这种情况下先把系统更新到最新补丁再看。5.3 vmmem进程内存占用过高Docker Desktop跑起来之后你可能会在任务管理器里看到一个叫vmmem的进程内存占用特别高。这个进程是WSL2虚拟机的内核进程Docker跑得越久它占用的内存可能就越高。因为WSL2的动态内存分配机制导致它不会主动把空闲内存归还给Windows。解决办法是创建一个.wslconfig配置文件放在用户主目录下C:\Users\你的用户名\.wslconfig[wsl2] memory4GB processors2 swap2GB保存文件后在PowerShell里执行wsl --shutdown再启动Docker Desktop。这样WSL2虚拟机最多只使用4GB内存杜绝了内存失控的风险。注意别把memory设置得太低低于2GB的话Docker跑一些稍微大的镜像可能直接OOM。5.4 镜像拉取超时或失败镜像加速器配置了拉取还是偶尔超时怎么办这里分几种情况。如果docker pull卡在Waiting状态很长时间首先确认加速器配置有没有生效。执行docker info看Registry Mirrors字段。如果配置了多个镜像加速地址可以检查一下第一个地址是否已经失效把它换成新的可用地址保留备用地址。如果是某个特定镜像拉取失败比如docker pull mysql:8.0报某个层的下载错误大概率是网络波动导致的。先执行docker system prune清理掉一半下载的缓存再重新拉取。这里顺带说一句docker system prune是个很有用的清理命令会删除所有停止的容器、未使用的网络、悬空镜像和构建缓存。我一般是每周执行一次能释放不少磁盘空间。不过它也会清理掉所有停止的容器如果你有某些停止状态的容器还想留着先docker start启动了再清理或者用docker rm把要丢弃的容器主动删掉。5.5 Docker Desktop一直卡在开机启动画面这个问题我遇到过一次表现是点击Docker Desktop图标后鲸鱼图标一直在加载动画很久都进不去主界面。排查思路是先看右下角托盘图标如果图标一直转圈多半是WSL后端没就绪。打开PowerShell执行wsl -l -v看有没有卡在Stopped状态的发行版。如果有执行wsl --shutdown强制关闭然后重启Docker Desktop。如果转圈问题依然存在检查是不是Windows时间不对。这个原因听起来匪夷所思但确实发生过——系统时间偏差过大可能导致Docker Desktop跟镜像仓库的TLS握手失败表现就是启动界面卡住不动。同步一下时间再启动Docker问题就消失了。6. 进阶一步从单容器到编排认识Docker Compose当你习惯了用docker run跑单个容器之后下一个自然的需求就是多个容器怎么一起管理比如你要在本地搭建一套开发环境包含MySQL、Redis、后端服务用docker run分别启动也不是不行但每次都要重敲一堆命令容器多了以后维护成本直线上升。这就是Docker Compose登场的场景。6.1 为什么需要Compose一个命令拉起整套服务Docker Compose的核心思想是基础设施即代码。你只需要写一个compose.yaml文件把要运行的所有容器、网络、数据卷声明在里面然后执行一条docker compose up -d整套服务就全部拉起来了。这个文件是可版本化的、可评审的、可复现的。换了一台新电脑把compose.yaml文件和挂载的数据目录拷过去一条命令就能还原出一模一样的服务环境。而用docker run的话不光命令难记还容易漏参数。6.2 一个实际可用的compose.yaml示例我来演示一个典型的场景MySQL 8.0加Redis 7这是大多数后端开发本地调试的基本套餐。先创建一个项目目录比如D:\dev-env在里面新建compose.yaml文件services: mysql8: image: mysql:8.0 container_name: dev-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 123456 TZ: Asia/Shanghai ports: - 3306:3306 volumes: - ./data/mysql:/var/lib/mysql command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_unicode_ci redis: image: redis:7 container_name: dev-redis restart: unless-stopped ports: - 6379:6379 volumes: - ./data/redis:/data command: - redis-server - --appendonly yes在D:\dev-env目录下打开PowerShell执行docker compose up -d两条命令的输出分别是MySQL8.0和Redis7的容器启动信息。再执行docker compose ps查看所有服务状态。这个文件里有几个值得注意的细节restart: unless-stopped容器意外退出时自动重启除非你手动stop它。对于本地开发环境来说很实用Docker Desktop一启动所有服务自动恢复。command自定义容器启动命令。MySQL这里通过命令行参数设置了utf8mb4字符集Redis这里开启了AOF持久化。./data/mysql相对路径的写法。Compose会把当前目录也就是compose.yaml所在目录作为基准路径。这意味着整个项目目录是可以完整迁移的。Compose自动创建了一个默认网络两个容器之间可以通过服务名互相访问。比如同网络下的后端服务要连MySQL主机名填mysql8而不是localhost。6.3 Compose的日常运维命令把服务跑起来之后日常运维基本就是下面这一套命令命令用途docker compose up -d创建并后台启动所有服务docker compose ps查看服务状态docker compose logs -f跟踪所有服务日志docker compose logs -f mysql8只跟踪mysql8的日志docker compose restart重启所有服务docker compose down停止并删除所有服务数据卷还在docker compose down -v停止并删除服务且删除数据卷谨慎使用特别提醒down -v这条命令-v参数会连带删除数据卷也就是说MySQL的数据会全部消失。我见过不止一个同事手滑跑过这条命令之后崩溃的。日常清理用down就够了down -v一定想清楚再用。6.4 从开发到部署Compose还能做什么Compose不是只能用在本地开发。很多小团队甚至直接用Compose文件做生产环境的容器编排。这里我不展开讲生产环境部署的细节但想提一个常见的应用场景。像GitLab、Jenkins这类重量级开发工具官方都提供了现成的docker-compose.yml模板。你在网上搜GitLab docker compose或者Jenkins docker compose能找到大量经过验证的配置。这些工具的安装配置在裸机环境下是出了名的繁琐尤其是GitLab光是依赖组件就够折腾半天的。用Compose部署把官方模板下载下来改几个端口和路径一条命令就起来了。在Windows上做本地开发测试这已经足够用了。等哪天需要上生产环境或者集群环境再考虑Kubernetes这类容器编排平台。7. 写在最后我踩过的一些坑和当前的最佳实践文章写到这里把Windows 10上安装Docker Desktop的全流程都过了一遍。最后分享几个我在实际使用中沉淀下来的习惯。第一所有数据类容器数据库、缓存、消息队列全部用Compose管理数据卷统一放在项目的./data目录下。这样备份数据就是复制整个目录恢复数据就是把目录拷回去再docker compose up -d简单粗暴但极其有效。第二定期执行docker system prune清理悬空镜像和构建缓存。Windows的磁盘空间本来就比Linux紧张我见过不少人C盘被Docker的镜像和构建缓存吃满最后只能重装系统。第三Windows上的Docker Desktop更适合做开发调试环境不建议在Windows上长期跑生产服务。生产环境还是建议用Linux服务器不管是云主机还是物理机Docker在Linux上才是完全体性能和稳定性都更可靠。如果确实需要在Windows上跑服务也尽量用WSL2后端并做好资源限制。这套流程我前前后后给不下十个人指导过从纯粹的Docker新手到想在本机搭一套GitLabMySQLRedis环境的同事按这个路径走下来基本都能顺利跑通。如果安装过程中遇到这篇文没有覆盖到的报错不妨把报错信息完整贴到搜索引擎里通常能找到对应的解决方案。Docker的生态已经足够成熟你遇到的坑大概率不是第一个踩进去的人。