ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Win11安装Docker完整指南:从WSL2配置到镜像加速与报错排查

Win11安装Docker完整指南:从WSL2配置到镜像加速与报错排查 最近帮同事在他那台新买的 Win11 笔记本上装 Docker本以为半小时能收工结果前前后后折腾了小半天。启动报错、虚拟化没开、WSL 版本太老、镜像拉不动一轮接一轮。回头复盘发现很多坑其实早在安装之前就能避开。这篇文章就把我实际操作的完整流程和踩坑记录整理出来从系统准备、WSL2 底座到 Docker Desktop 安装、报错排查、镜像加速再到跑起第一个容器按步骤走尽量一次到位。如果你正准备在 Win11 上安装 Docker或者已经装完但启动失败这篇应该能帮上忙。需要先说明一下我这次演示用的环境是 Win11 23H2 以上版本搭配 Docker Desktop 4.x 稳定版。不同小版本之间界面可能有细微差别但核心逻辑完全一致照着走没有问题。1. 准备阶段先确认三件事系统版本、虚拟化开关和 WSL2 底座1.1 你的 Win11 版本和硬件够不够格Docker Desktop 的官方要求写得挺清楚64 位 Windows 10/11CPU 支持虚拟化内存不小于 4GB推荐使用 WSL2 后端。需要注意的是Win11 家庭版、专业版、企业版都可以安装别被网上必须专业版的说法误导。家庭版默认没有 Hyper-V但 Docker Desktop 走 WSL2 后端时压根不需要 Hyper-V反而不受没有 Hyper-V这个问题的影响。这里有个容易被忽略的细节Win11 本身对硬件有严格门槛比如 TPM 2.0。如果你的机器是通过非常规手段绕过检测装上的 Win11后续装 Docker 时WSL 和虚拟机平台往往会表现出一些莫名其妙的兼容问题。我见过一台强装Win11 的老笔记本设备管理器里虚拟化组件时好时坏Docker Desktop 启动时磁盘 IO 直接拉满最后卡死。所以我的建议是优先用官方支持的镜像正常安装 Win11把系统底座打牢再谈 Docker。系统版本怎么查WinR 输入winver看到版本在 22H2 以上基本就没问题。另外强烈建议把系统更新到最新稳定版Windows 功能组件越新WSL2 踩坑越少。1.2 先看一眼 CPU 虚拟化有没有开Docker Desktop 在 Win11 上跑容器底层依赖 Windows 的虚拟化能力不管后端走 Hyper-V 还是 WSL2。CPU 的硬件虚拟化Intel VT-x 或 AMD SVM如果没开后面必然报错。检查方法很简单按 CtrlShiftEsc 打开任务管理器切到性能标签看 CPU 区域里的虚拟化字段显示已启用就说明硬件层面没问题。如果显示已禁用就得进 BIOS/UEFI 设置。开机时按 Del 或 F2 进入固件设置具体按键因主板而异一般在开机画面有提示找到类似 Intel Virtualization TechnologyIntel 平台或 SVM ModeAMD 平台的选项设为 Enabled保存退出。顺带一提有些主板还有 VT-d 选项这是 IOMMU 相关功能对 Docker 本身不是必须的开着也行但别指望它解决 Docker 的启动问题。实测心得这一步最好在装 Docker 前就搞定。我见过有人折腾了一晚上最后发现只是 BIOS 里虚拟化没开。1.3 理解 WSL2Docker Desktop 为什么非要它不可很多人不理解为什么要先装 WSL总觉得多此一举。简单说WSL2 是一个轻量级虚拟机它运行在 Windows 的虚拟机平台上自带完整 Linux 内核。Docker Desktop 在 Windows 上有两种后端早期基于 Hyper-V现在默认基于 WSL2。为什么 WSL2 成了主流方案直观对比一下对比项WSL2 后端Hyper-V 后端启动速度秒级较慢内存占用动态分配较省分配后不易回收文件互操作可直接访问 Windows 文件系统相对封闭适用 Win11 家庭版支持家庭版无 Hyper-VDocker Desktop 默认默认选择需要在安装时手动切换最关键的一点是WSL2 和 Windows 文件系统能无缝互操作容器里可以直接访问/mnt/c下的 Windows 文件。这意味着你在 Win11 上装 Docker走的其实是Windows 调度 WSL2 虚拟机WSL2 虚拟机里运行 Docker 引擎这条路。所以 WSL2 底座如果不干净Docker 一定跑不顺。顺便提醒一句如果你以前装过旧版本 WSL比如 WSL1后续操作里一定要明确把它升级到 WSL2否则 Docker Desktop 启动时会一直提示找不到 WSL2。2. 开启 WSL2 和虚拟机平台两条命令真的能搞定大部分问题2.1 管理员 PowerShell 里敲什么Win11 22H2 及以上版本最简单的开启方式是这样右键开始菜单选择终端(管理员)或Windows PowerShell(管理员)执行一条命令wsl --install这条命令会自动安装 WSL、虚拟机平台并默认启用 WSL2。执行完按提示重启重启后 WSL 一般就绪了连发行版都不用你手动装。这里多说一句纯跑 Docker 的话自己手动安装 Ubuntu 发行版不是必须的Docker Desktop 会自动创建一个专用的发行版后端。如果你的机器已经装过 WSL 但版本混乱或者wsl --install执行后没有任何反馈那就用下面这套组合命令手动开启功能dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一行是打开适用于 Linux 的 Windows 子系统第二行打开虚拟机平台。这两项在控制面板的启用或关闭 Windows 功能里也能勾上但命令行更省事还能看到精确的进度。执行完记得重启电脑这两项功能必须重启后才完全生效。2.2 为什么不建议图省事直接装旧版网上很多老教程会让你先装一个 Ubuntu 发行版再回来装 Docker那是早期绕不开的路。Docker Desktop 4.x 时期你完全不需要手工安装发行版。我在多台机器上实测流程就是开启功能、重启、装 Docker Desktop、自动创建 WSL 后端。如果你自己额外装了 Ubuntu反而要注意 Docker Settings 里的 WSL 集成别重复配置否则多个发行版之间会出现镜像来源和磁盘占用互相干扰的情况。个人建议Docker Desktop 专用的后端交给它自己管理你自己的 Ubuntu 用来做开发两边通过 WSL 集成正常通信就行别去手动改 Docker 后端的发行版文件。2.3 重启后必须做的状态检查重启回来打开 PowerShell执行wsl --status wsl --version理想情况是看到默认版本: 2以及一个不太老的 WSL 版本号。如果提示需要更新内核就执行wsl --update这个命令会把 WSL 升级到最新同时修复一堆已知 Bug。更新完再跑一遍wsl --version确认版本号已经变化。然后执行wsl --list --verbose简写wsl -l -v正常会看到一个发行版列表。如果这里是空的不用慌——Docker Desktop 装完会自动注册它自己的发行版。但如果这里显示的是 VERSION 1说明默认版本没切过去需要执行wsl --set-default-version 2实在不行还能用wsl --set-version 发行版名 2单独转换但这条命令对 Docker Desktop 自动创建的发行版一般用不上。3. 下载安装 Docker Desktop安装选项、首次启动和引擎设置3.1 下载渠道与安装细节Docker Desktop 从官网 docker.com 的产品页下载即可。国内用户如果官网下载慢可以找一些正规软件源下载固定版本安装包但注意核对文件校验和别去不明网站下载。安装包下载好后双击运行。有几个点要特别留意安装过程中如果弹出 Use WSL 2 instead of Hyper-V 的勾选选 WSL2。安装向导里的 Add shortcuts 选项随意不影响使用。整个安装过程会请求管理员权限必须同意。装完提示重启时别偷懒重启一次最稳。我实测过两次跳过重启之后 Docker Desktop 启动界面转圈半天下不来重启一次立刻正常。3.2 首次启动等一等给它一点时间装完重启后桌面和开始菜单会有 Docker Desktop 图标。双击运行首次启动有个初始化过程主要体现在三个方面底部状态栏的鲸鱼图标转圈持续几十秒到几分钟不等。首次运行时会提示接受服务条款界面是英文的把弹窗看完点 Accept 就行。期间 Docker Desktop 会自动创建名为 docker-desktop 和 docker-desktop-data 的 WSL 发行版。你可以在 PowerShell 里用wsl -l -v看到它们出现状态为 Running。很多人在这一步以为软件卡死了其实只是后台在做初始化。判断标准很简单鲸鱼图标从转圈变成静态右键菜单里的 Dashboard 能打开就算启动完成。如果等了十分钟还在转圈再按第 4 节的排查链路走。3.3 核心设置项逐个说明启动成功之后进入 Settings齿轮图标建议按下面的清单过一遍General - Start Docker Desktop when you sign in按需勾选。如果只是偶尔用 Docker不勾能省内存。Resources - Advanced - Memory默认取值通常是宿主机内存的一半。个人经验是日常开发 4~8GB 够用如果要跑多个微服务或 MySQL、Redis、ES 这类服务再看情况往上加。给 WSL2 的内存不是越多越好留一部分给 Windows 自身否则 Windows 会变卡。Resources - WSL Integration确认你需要的发行版集成开关是打开的。如果你自己装了 Ubuntu勾上它如果只跑 Docker Desktop保持默认也是一样的。Docker Engine这是后面配置镜像加速要用的入口里面是一段 JSON第一次打开先别乱动把默认配置截图留档方便以后对比。很多人还会问虚拟内存设置多少合适。在 Windows 层面如果你内存 16GB 以下建议让系统自动管理虚拟内存就行如果一定要手动设置初始大小和最大值建议都设为物理内存的 1.5 倍以上。Docker 本身是个吃内存大户但跟虚拟内存关系不大真正的瓶颈在 WSL2 分配了多少内存。我一般保持自动管理虚拟内存只在 Docker Desktop 里限制 WSL2 内存上限。4. Virtualization support not detected这个经典报错的完整排查链路4.1 报错发生的真实原因链如果你打开 Docker Desktop 直接弹红字Virtualization support not detected. Docker Desktop failed to start because virtualisation support wasnt detected.先别急着卸载重装。这句话翻译过来是Docker Desktop 找不到虚拟化支持但它不代表任何一种具体故障而是一整条链路上的问题。链路从下往上依次是CPU 的硬件虚拟化VT-x/SVM是否开启Windows 的虚拟机平台功能是否启用WSL2 是否安装、内核是否够新Docker Desktop 本身是否完整安装、服务是否被系统或杀软拦截。任何一个环节断了最终都会报这句。所以排查顺序就是从下往上逐一坐实。4.2 排查顺序从硬件到软件一步步来第一步回到任务管理器确认 CPU虚拟化字段。如果显示已禁用去 BIOS 打开这个前面已经说过了。第二步在管理员 PowerShell 里检查 Windows 功能状态Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux返回结果里的 State 应该是 Enabled。如果是 Disabled用第 2 节里的 dism 命令开启重启。第三步验证 WSL 本身。执行wsl --version如果提示WSL 安装不完整或版本过旧执行wsl --update。这里有个小技巧即使 Docker Desktop 已经装完只要你之后运行过wsl --update最好也重启一下 Docker Desktop右键鲸鱼图标 - Quit Docker Desktop再重新打开因为 WSL 内核升级后Docker 的后端发行版也需要重新加载。第四步看 Windows 安全中心有没有拦截。有些杀毒软件会默认拦截 WSL 的虚拟化功能或 Docker Desktop 的网络访问。遇到这种情况把 Docker Desktop 和相关服务加入信任列表即可。如果这一步没问题卸载 Docker Desktop删干净后重装一次成功率非常高。我把常见现象整理成一个对照表方便你快速定位现象最可能的原因处理办法任务管理器里虚拟化已禁用BIOS/UEFI 未开启 VT-x/SVM进 BIOS 开启重启wsl --version 报错或版本过旧WSL 内核缺失或过旧wsl --update 后重启 Docker镜像拉不下来镜像源失效重新配置 registry mirror见第 5 节容器可以起但网络不通防火墙拦截或代理问题放行 Docker 或配置代理Docker Desktop 一直转圈WSL 后端未初始化或系统功能需重启确认功能开启后重启系统4.3 其他高频启动失败问题一览除了上面这个经典报错还有几个我实际碰到过的问题Docker Desktop Access Denied常见于账户权限不够。解决方式是右键以管理员身份运行或者把当前用户加入 docker-users 组。启动后提示端口被占用比如 2375。这种情况一般是机器上跑了其他容器管理工具或调试代理把占用进程找出来关掉就行。升级 Win11 系统版本后 Docker 起不来。Win11 大版本更新比如从一个年度版本升级到下一个有时会重置 Windows 功能或 WSL重新执行wsl --update和wsl --set-default-version 2再启动 Docker 就行。5. 拉镜像慢怎么办配置 registry mirror 的正确姿势5.1 为什么 Docker Hub 直连这么慢Docker 默认从 Docker Hub 拉镜像这个公共仓库服务器在境外直连速度经常让人崩溃。你执行docker pull mysql:8.0时进度条可能卡住不动或者几十 KB/s 地爬。这几乎不是你的网络问题而是物理距离带来的访问延迟。解决思路是给 Docker 引擎配置一个镜像加速器registry mirror。它的原理很简单容器引擎在拉镜像时会先访问你配置的镜像源如果源上有缓存或同步了目标镜像就直接从源拉取速度会快很多。5.2 在哪里配置镜像加速在 Docker Desktop 里路径是Settings - Docker Engine。这个页面显示的是一段 JSON 配置在默认配置基础上加一个registry-mirrors字段即可{ registry-mirrors: [ https://your-mirror.example.com, https://another-mirror.example.com ] }注意上面只是格式示例。实际配置时你要把这个地址替换成自己获取到的可用镜像源地址。我建议的方式有两种如果你有阿里云等云厂商账号登录容器镜像服务控制台里面会分配一个专属的加速器地址格式类似https://xxxx.mirror.aliyuncs.com这个是给个人账户绑定的比较稳定。如果公司或学校有内网镜像源直接问运维要一个 registry mirror 地址填进去内网拉镜像通常比公网快很多。填好后点 Apply restartDocker Desktop 会用新配置重启引擎。这是最快验证配置是否生效的方式同时也是最方便回滚的方式——配置有问题直接删掉那两行Apply 回去就行。5.3 验证加速是否生效docker info 是最好的体检表配置完之后打开终端执行docker info输出往下找看到 Registry Mirrors 一节下面列着你配置的地址就说明引擎真的加载了它。然后试拉一个稍大的镜像docker pull mysql:8.0进度条如果明显比之前快就说明加速生效。如果还是慢可能原因有两个一是地址填错了引擎没加载成功二是该镜像源本身已失效或没有缓存你要的镜像。前者看docker info就能确认后者换一个源再试。这里要特别提一句镜像加速器不是代理它只是让 Docker 从更近的源拉镜像。如果你在公司网络环境通常还需要去 Settings - Resources - Proxies 里配置 HTTP 代理这是企业网络的常规操作账号密码问 IT 要和 Docker 本身没有关系。6. 装完后能干什么hello-world、MySQL 和 Compose 三板斧6.1 用 docker run 跑通第一个容器环境就绪后先跑一个最简单的验证docker version docker run --rm hello-worlddocker version如果能看到 Client 和 Server 两段信息且 Server 段正常输出就说明 Docker 引擎在工作。hello-world 镜像极小拉取后容器运行会打印一段欢迎信息哪怕镜像加速没配这一步也基本不会卡住。在 Windows 上docker 命令可以直接在 PowerShell 里用因为 Docker Desktop 安装时已经把 CLI 路径加进系统环境变量了。如果你发现 docker 命令不存在多半是安装时没勾选加 PATH 的选项重装一次或者在安装后手动把C:\Program Files\Docker\Docker\resources\bin加进 PATH。6.2 跑一个 MySQL 8.0顺便把数据卷和时区一起搞明白跑数据库是 Docker 最常用的场景之一。命令倒不长但有几个参数值得真正理解docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORDyour-password -e TZAsia/Shanghai -v mysql_data:/var/lib/mysql mysql:8.0拆开看-d后台运行。--name给容器起个名字方便管理。-p 3306:3306宿主机 3306 映射到容器 3306。左边是宿主机端口右边是容器端口。改左边这个可以避免和其他软件冲突。-e MYSQL_ROOT_PASSWORD设置 root 密码。第一次启动必须给否则容器会失败。-e TZAsia/Shanghai容器内时区不给的话默认 UTC和本地时间差 8 小时查日志和写数据时会很困惑。-v mysql_data:/var/lib/mysql把 MySQL 的数据目录挂载到命名卷mysql_data。以后删掉容器重来数据还在。这一步千万别省不然容器一删数据库就没了。如果宿主机已经装了 MySQL 占了 3306把左边的-p 3306:3306改成-p 3307:3306然后用127.0.0.1:3307连接即可。6.3 Docker Compose以后建环境别再用一堆 run 命令当你需要同时跑 MySQL、Redis、后端服务时一个个docker run就太累了。这时候用 Compose。新版的 Docker Desktop 自带 Docker Compose v2直接用docker compose命令不需要单独安装插件。在任意目录创建一个 compose.yaml内容示意如下services: mysql: image: mysql:8.0 container_name: mysql8 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: your-password TZ: Asia/Shanghai volumes: - mysql_data:/var/lib/mysql restart: unless-stopped volumes: mysql_data:然后在同一个目录执行docker compose up -dDocker Compose 的优势不只是少敲几行命令更关键的是配置可分享。这个 compose.yaml 文件可以直接发给同事别人拿到后一条命令就能跑出一模一样的环境再也不怕我这能跑你那怎么不行。资源占用方面如果同时跑了好几个容器觉得卡在 Docker Desktop 的 Resources 里把 WSL2 内存上限调到 8GB 或更高同时检查宿主机是否还有空闲内存。真正撑不住的时候优先考虑用 Compose 把不常用的服务停掉docker compose stop而不是一直放在后台。整个流程走下来我自己最大的体会是Win11 装 Docker 这件事绝大多数坑都不是 Docker 本身的问题而是 WSL2 和虚拟化这条链路没铺平。先把系统底子检查好再把功能开对安装其实很顺。如果你现在正卡在某个报错上建议别急着搜第 N 个教程按第 4 节的排查顺序从下往上过一遍多数问题半小时内就能定位。真到了要用容器的时候先把 MySQL 跑起来试试能输对一次密码Docker 基本上就永远留在你的开发环境里了。
返回列表