ARTICLE DETAIL

资讯详情

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

Docker Desktop安装与镜像加速全攻略:虚拟化、WSL2与高频报错排查

Docker Desktop安装与镜像加速全攻略:虚拟化、WSL2与高频报错排查 前阵子组里来了个新同学Windows机器折腾了一下午没把 Docker Desktop 装起来。我过去一看启动界面直接弹了个红框virtualization support not detected未检测到虚拟化支持。帮他把 BIOS 里的虚拟化选项打开重启再启动 Docker Desktop三分钟就通了。这一类问题我在 Windows 和 Mac 上都见过太多次恰好这段时间又在帮几个同事同步环境索性就把环境准备、Docker Desktop 的安装、镜像源加速配置以及几个高频报错的完整排查链路一次性写清楚。这篇文章适合两种人一是从来没装过 Docker Desktop 的小白照着做就行二是 Docker 已经装上了但是 pull 镜像慢、启动报错的开发者可以直接跳到第 5 章的排查链路。先给个结论Docker Desktop 在 Windows 和 Mac 上的安装真正卡人的从来不是安装包本身而是这台机器有没有满足前置条件。前置条件说白了就两件事——虚拟化支持、容器运行环境。Windows 这边是 WSL2Mac 相对省心一些。把这两件事理顺安装过程基本就是一路下一步。剩下最影响体验的就是镜像源加速这一项直接决定你后面docker pull是等几秒还是等几分钟必须好好配。1. 装之前先搞清楚 Docker Desktop 的运行逻辑与镜像加速原理很多人在装 Docker Desktop 之前对它在 Windows 和 Mac 上到底怎么跑起来的完全没有概念所以一旦报错就一脸懵。其实这个底层模型搞清楚之后大部分报错你扫一眼就能猜到问题出在哪。1.1 Windows 和 Mac 上 Docker Desktop 都在跑一台 Linux 虚拟机这个要从 Docker 的本质讲起。Docker 容器的底层依赖 Linux 内核特性cgroups 做资源隔离namespace 做进程隔离。Windows 和 macOS 都是非 Linux 系统没有 Linux 内核所以在这两个平台上跑容器必须有一个 Linux 环境垫底。Docker Desktop 的做法就是维护一台轻量级的 Linux 虚拟机所有容器都在这台虚拟机里运行。Windows 上Docker Desktop 默认走 WSL2 后端。WSL2 听起来像子系统实际上是一台由 Windows 虚拟化平台托管的轻量虚拟机里面跑着一个真正的 Linux 内核。Docker Desktop 把容器都放在这个 WSL2 发行版里。如果你的 CPU 虚拟化没开WSL2 就起不来Docker Desktop 启动时就会报 virtualization support not detected。Mac 上则用的是苹果自家的 Hypervisor.framework 框架同样是一台轻量 Linux VM只是这台 VM 完全由 Docker Desktop 自己管理用户不需要去 BIOS 里开什么开关。所以无论你在哪个平台有一个条件是绝对的必须支持硬件虚拟化。Windows 需要到 BIOS 里确认Mac 系统默认就是开启的这也是为什么 Mac 安装过程比 Windows 省心很多。对比项WindowsmacOS依赖的虚拟化层WSL2 或 Hyper-VHypervisor.framework虚拟化开关位置BIOS/UEFI需手动确认系统默认启用常见安装问题虚拟化未开启、WSL2 未就绪芯片架构选错下载包核心要点记住一句话Docker 容器依赖 Linux 内核特性非 Linux 平台必须提供 Linux 虚拟机虚拟化支持是绝对前提。后面排查时报错再花哨第一件事永远是检查它。1.2 镜像源加速的本质给 Daemon 配一个缓存中转站再说镜像源加速。很多人一听到加速两个字就以为和网络代理有什么关系其实不是一码事。镜像源加速在 Docker 里的术语叫 registry mirror也就是镜像仓库的镜像站。正常执行docker pull mysql:8.0时Docker Daemon 会去官方镜像仓库拉取镜像。配置了 registry mirror 之后Daemon 会优先从你指定的镜像站拉取。这个镜像站本质上是一个缓存服务它已经把官方仓库里常见的镜像同步了一份你拉取的时候它直接返回缓存不需要你隔山跨水地慢慢下载如果缓存里没有它会替你从上游拉取一次然后再缓存下来。所以说白了镜像源加速不改动你任何一条docker pull命令也不改动镜像的 tag更不影响容器运行时的行为。它只影响镜像从哪个地址下载这一个环节带来的直接收益就是拉取速度更快、失败率更低。这里要特别提醒一点registry mirror 是配置给 Docker Daemon 的不是配置给操作系统的。不要试图用某个系统级的网络工具来解决docker pull慢的问题那完全是两层东西。正确的做法就是打开 Docker Desktop 的设置把 registry-mirrors 写到 daemon.json 里。原理明白了下面开始落地。2. Windows 平台安装虚拟化检查、WSL2 启用与首次启动Windows 上装 Docker Desktop 的流程可以拆成三段检查虚拟化、准备 WSL2、安装 Docker Desktop 本体。任何一段出问题后面都起不来所以一步一步来。2.1 第一步永远是看 CPU 虚拟化开没开Windows 上装 Docker Desktop 的第一条铁律先检查虚拟化支持再下载安装包。方法很简单——打开任务管理器切到性能标签选中 CPU看右下角的虚拟化字段。如果显示已启用说明硬件虚拟化已经是开着的直接跳过 BIOS 这一步。如果显示未启用就需要重启进 BIOS/UEFI 设置界面。不同主板厂商的入口不一样最常见的是开机时按 Del 或 F2也有一些品牌机是 F10、F12 或者 ESC。进去之后找 Intel Virtualization TechnologyIntel 平台也叫 VT-x或者 SVM ModeAMD 平台把它设为 Enabled保存退出重启。有一些机器的 BIOS 里有两个相关选项一个是 VT-x一个是 VT-d。Docker 只依赖 VT-x但 VT-d 也建议顺手打开因为它和虚拟机的设备直通有关以后你如果要跑 KVM 或者其他虚拟化方案都用得上。另外还有一种少见情况BIOS 明明开了任务管理器里却还是显示未启用。这种时候去启用或关闭 Windows 功能里看一眼虚拟机平台有没有勾选因为有些精简版系统默认没有装这个组件勾上之后重启通常就好了。2.2 把 WSL2 环境准备好虚拟化确认没问题之后Windows 上的下一步是准备 WSL2。Windows 11 是最省事的用管理员身份打开 PowerShell执行一条命令wsl --install这条命令会把 WSL2 内核、虚拟机平台、以及默认的 Linux 发行版通常是 Ubuntu全部装好然后你重启一次就行。Windows 10 则建议手动走一遍完整流程打开控制面板 程序 启用或关闭 Windows 功能勾选适用于 Linux 的 Windows 子系统和虚拟机平台两个选项重启系统去微软官网下载 WSL2 内核更新包并安装用管理员 PowerShell 执行wsl --set-default-version 2需要说明的是Windows 10 较新版本里wsl --install命令也能用但老版本没有这个命令手动流程更保险。如果你的系统版本比较老先把系统补丁更新到位再操作。验证 WSL2 是否就绪在 PowerShell 里执行wsl --status wsl -l -v如果输出里发行版的版本号是 2说明已经是 WSL2 了。如果显示的是 1执行wsl --set-version 发行版名称 2把它转换到 WSL2。这里有个小坑如果你机器上装过 Docker Toolbox 或者老版本的 Docker建议先卸载干净再走 WSL2 流程不然残留的配置容易和新的后端打架。另外不建议手动下载多个 Linux 发行版Docker Desktop 自己会管理它需要的发行版你只需要保证 WSL2 本身是正常的就行。2.3 安装 Docker Desktop 并验证 hello-worldWSL2 就绪之后去 Docker 官网下载 Docker Desktop for Windows。安装过程中如果安装器问你Use WSL 2 instead of Hyper-V选 WSL2。装完之后启动 Docker Desktop首次启动会做一次环境自检可能需要等一会儿。注意如果你是启动时直接卡在 Docker Engine starting 界面或者弹了虚拟化相关的红色报错千万别急着反复卸载重装先按第 5 章的排查链路走一遍。第一次启动时 Docker Desktop 会在后台创建它自己的 WSL2 发行版这一步如果 WSL2 本身有问题就会一直转圈。验证是否装好在终端里执行docker version docker run --rm hello-world能正常输出 Docker 版本信息再看到 Hello from Docker 的提示说明 Windows 这边已经通了。第一次执行docker run hello-world的时候因为要下载镜像卡个几秒到几十秒都很正常。如果一直转圈不动说明镜像加速还没配直接看第 4 章。3. Mac 平台安装芯片架构、两种安装方式与资源分配Mac 上的安装体验比 Windows 流畅不少不需要进 BIOS也不需要手动准备虚拟化环境。但 Mac 有一个自己独有的坑芯片架构。3.1 先看芯片再选安装包打开关于本机看芯片那一栏。如果是 Apple M1/M2/M3/M4 这样的字样说明是 Apple Silicon 机器去下载 arm64 版本的 Docker Desktop。如果是 Intel 字样下载 amd64 版本。选错架构的后果很直接Intel Mac 上装了 arm64 包系统会直接提示无法打开Apple Silicon 上装了 Intel 包虽然能通过 Rosetta 转译跑起来但性能和稳定性都有损耗。Docker 官网下载页通常会根据当前浏览器自动识别架构但如果你在别的设备上下载了安装包再拷贝过来就要多留个心眼。在 Apple Silicon 上Docker Desktop 也是跑在一个 Linux VM 里只是这个 VM 基于苹果的 Hypervisor.framework资源调度比 Windows 那套更高效。macOS 版本建议 Big Sur 以上系统太老的话虚拟化框架的兼容性没保障。另外 Apple Silicon 的 Mac 内存是统一内存架构Docker 分配的内存会和应用共享所以资源配额那一步尤其重要后面 3.3 我会说。3.2 dmg 安装与 Homebrew 安装两种路线Mac 上装 Docker Desktop 有两条路线直接下载 dmg或者用 Homebrew。直接下载 dmg 是最直观的下载完双击挂载把 Docker.app 拖进 Applications 目录然后打开它。第一次打开的时候macOS 的 Gatekeeper 可能会弹无法验证开发者之类的提示这是因为默认只允许 App Store 和已签名应用。处理方法打开系统设置 隐私与安全性页面下方会出现关于 Docker 的拦截说明点仍要打开即可。用 Homebrew 安装则是命令一条brew install --cask docker好处是以后升级 Docker Desktop 也只需要brew upgrade一条命令。坏处是你得先有一台能正常工作的 Homebrew。身边用 Mac 的朋友经常在安装 Homebrew 失败上折腾半天这属于 Homebrew 自己的问题多半是下载脚本超时、源地址不稳定之类。建议先把 Homebrew 的安装源和更新源切到可用的国内镜像再来装 Docker不然会连环卡住。还有一个小细节Mac 上装完 Docker Desktop第一次启动时系统会在隐私与安全性里请求本地网络权限一定要允许。如果拒绝了这个权限后面容器内访问宿主机服务的时候会出现一些莫名其妙的网络问题排查起来非常头疼。3.3 首启配置资源限额与文件共享Mac 上 Docker Desktop 首次启动会有一个 Onboarding 引导建议直接走完。然后打开 Settings重点看两块在 Resources 里设置 CPU 和内存限制。不是给得越多越好Docker 占太多内存会让整个 Mac 变卡。我的经验值开发机 16GB 内存的话给 Docker 分配 4GB8GB 内存的老机器先分 2GB跑大型镜像时再临时加。在 File sharing 里添加需要挂载进容器的代码目录。Apple Silicon 的 Docker Desktop 默认使用 Virtiofs 文件共享方案性能比老式 osxfs 好很多。但要控制挂载范围别把整个家目录都挂进去挂载范围越大容器文件操作的性能损耗越明显。Mac 上的默认配置其实已经够用重点就是别贪心。资源给得过猛容器是爽了你的浏览器和 IDE 就要受苦了。4. 镜像源加速配置从图形界面到 daemon.json镜像源加速是安装 Docker Desktop 之后的第一件正事。不配的话你docker pull一个 MySQL 镜像可能要等好几分钟配完之后往往十几秒就完事。这一章把配置入口、地址选择和验证方法讲透。4.1 在哪里配置 registry-mirrorsWindows 和 Mac 上的 Docker Desktop 配置入口完全一致打开 Settings找到 Docker Engine 一栏。这个页面本质上就是 daemon.json 的图形化编辑器你在这里改配置点 Apply Restart 之后 Daemon 会带着新配置重启。在 JSON 体里加一个 registry-mirrors 数组格式像这样{ registry-mirrors: [ https://xxxx.mirror.aliyuncs.com ] }里面的地址要换成你自己能用的具体怎么拿下一个问题说。Apply 之后 Daemon 重启配置就生效了。如果你懒得走图形界面直接改配置文件也可以Windows 上默认路径是%USERPROFILE%\.docker\daemon.jsonMac 上是~/.docker/daemon.json但日常使用完全不需要手动找这个文件图形界面改起来更不容易出错。4.2 加速地址怎么选最稳这是被问得最多的问题。我的建议是优先使用云厂商的专属加速器尤其是阿里云容器镜像服务这是个人用户最稳妥的选择。开通方式注册一个阿里云账号免费进容器镜像服务控制台找到镜像加速器页面上面会显示一个专属地址格式类似https://xxxx.mirror.aliyuncs.com。这个地址是每个账号独有的拿到之后直接填进 registry-mirrors 数组就行。不太建议在搜索引擎里随便找一串公共加速地址就填进去。公共地址有两个问题一是你不知道它哪天就停止服务了域名一失效Docker Daemon 会去尝试下一个源甚至直接回源但你的拉取体验就会变得忽快忽慢二是很多公共站为了控制成本会限制并发高峰期一样慢。云厂商的专属地址至少服务稳定性有保障注册花不了五分钟。如果你一定要配多个地址备用也可以。Daemon 会按顺序依次尝试示例{ registry-mirrors: [ https://xxxx.mirror.aliyuncs.com, https://hub-mirror.c.163.com ] }注意多个地址之间是按顺序尝试而不是并发同时拉只要第一个能通Daemon 就会一直用第一个。所以把最稳的那个地址放在最前面。4.3 配置后如何确认加速真的生效配完别急着跑业务项目先花两分钟确认生效。Windows 上执行docker info | findstr registry-mirrorsMac 或 Linux 上执行docker info | grep registry-mirrors输出里能看到你配置的地址说明配置已经被 Daemon 接受了。然后再做一个实测拉一个体积稍大的镜像比如docker pull mysql:8.0如果下载速度有明显提升说明加速正在干活。如果配置完了仍然慢先检查 daemon.json 的 JSON 格式是不是有问题比如多了一个逗号或者少了引号这种低级错误其实很常见再检查加速地址本身是否可用零成本方法是在浏览器里直接访问这个地址能打开一般说明服务还活着。5. 安装和加速过程中高频报错的完整排查链路这一章是全文的干货重灾区。我把最近遇到的和社区里高频出现的几个报错按照完整排查链路写出来。你遇到问题的时候照着顺序往下查比自己瞎试快得多。5.1 virtualization support not detected 的链路排查这个报错是 Windows 用户的头号拦路虎也是最容易被卸载重装冤枉的。别急着重装按这个链路走。第一步确认 BIOS 虚拟化。按第 2.1 节的方法打开任务管理器看虚拟化字段。未启用就进 BIOS 开启。有些品牌机的 BIOS 里不叫 VT-x叫 Virtualization Extension是一个意思开启后必须彻底关机再开机而不是只重启 Docker。第二步确认 Windows 功能组件。管理员 PowerShell 里执行systeminfo看输出里 Hyper-V 要求那一部分如果显示支持已检测到说明硬件层面没问题。然后再去启用或关闭 Windows 功能里确认两个选项都勾上了虚拟机平台和适用于 Linux 的 Windows 子系统。很多人以为只要有 Hyper-V 就行但 Docker Desktop 走 WSL2 后端的时候上面两个功能缺一个都不行。第三步看 WSL2 的实际状态wsl --status wsl -l -v如果提示没有安装任何发行版执行wsl --install装一个。Docker Desktop 启动时会自动创建并管理它需要的 docker-desktop 发行版但前提是 WSL2 本身是可用的。如果 WSL2 处于坏掉的状态Docker 就会一直报虚拟化错误。第四步排除 Docker Desktop 版本问题。非常老的版本比如 4.1x 以前对 WSL2 的兼容性有不少 bug直接升级到最新正式版。Settings 里有 Check for Updates升级后大概率能解决一部分莫名其妙的启动失败。如果以上全查完还报错最后再考虑 Windows 安全中心的内核隔离设置。有个叫内存完整性的开关可能会干扰虚拟化层的检测关掉之后重启再试一次。这个情况我在实机上遇到过属于小概率但真实存在的坑。5.2 pull 镜像报 failed to decode referrers index 的根因与处理failed to decode referrers index这个报错最近在中文社区出现的频率非常高而且大都集中在 Docker Desktop 用户身上。典型报错信息failed to decode referrers index: invalid ...出现场景通常是docker pull mysql、docker pull nginx这些非常常见的镜像。先说根因新版本的镜像仓库在返回镜像清单manifest时带上了 referrers 相关的元数据老版本 Docker Desktop 的解析器处理不了这种新格式直接抛异常。说白了就是客户端太老服务端的数据格式升级了两边没对上。排查链路按顺序走先看 Docker Desktop 版本Settings 的 About 页面能看到。4.3x 以下版本遇到这个问题的概率非常高直接升级到最新版。实测下来升级后绝大多数情况报错直接消失。升级后仍然报错就去 Settings Resources Advanced找一下有没有Use containerd for pulling and storing images这个开关。如果它是开启的把它关掉然后 Apply Restart。这个开关启用后Docker 会把镜像拉取和存储切换到 containerd 的 snapshotter某些场景下解析 referrers 数据会踩坑关掉回到传统路径通常就正常了。还不行检查 daemon.json 里的 registry-mirrors。有一些镜像加速站会对镜像的 manifest 做二次处理拉回来的数据结构和官方不一致客户端解析就会失败。临时把 registry-mirrors 清空重启 Daemon再 pull 一次。如果清空之后正常说明问题出在某个加速地址上换一个地址即可。最后一步换 tag 做交叉测试。比如mysql:8.0换成mysql:8.0.39或者mysql:latest。如果某个 tag 的 manifest 异常换一个就能绕过去。我见过不少人一看到这个报错就去折腾 DNS、折腾证书、甚至准备重装系统都跑偏了。先升级、再关 containerd 开关、再检查 mirror 配置这个顺序走完绝大多数情况已经解决。5.3 DNS 解析类错误的排查另一类非常常见的报错信息包括unable to resolve hostTemporary failure in name resolutionEOF这类错误的核心原因基本是Docker Daemon 或者容器内部在解析镜像仓库域名时失败了。Windows 下走 WSL2 后端时WSL2 的 DNS 有时候会被宿主机上的一些安全软件或者网络工具改乱导致解析异常。排查链路先用浏览器直接访问镜像加速地址能打开说明主机网络本身没问题问题大概率出在 WSL2 或 Docker 层。再检查 WSL2 里的 DNS 配置。进入 WSL2 发行版执行cat /etc/resolv.conf看 nameserver 地址是否正常。如果地址不对可以手动改为一个公共 DNS 地址临时测试。如果问题确认在容器或 Daemon 层可以在 Docker Engine 的配置里临时加一个 dns 字段{ dns: [223.5.5.5, 119.29.29.29] }这两个都是国内公共 DNS 服务。加完 Apply Restart 再 pull 测试。建议把 DNS 排查放在镜像加速排查之后因为很多pull 不动的情况其实是加速地址失效而不是 DNS 问题。先用docker info确认 registry-mirrors 配置再用浏览器测试加速地址是否存活最后才去动 DNS 设置这个顺序能帮你少走很多弯路。5.4 端口占用导致的 Docker 启动与容器启动失败还有一类报错特征非常明显基本一眼就能认出来port is already allocatedError starting userland proxybind: address already in use最常见的是容器端口映射和本地已有的服务撞车了。比如你本地 8080 端口已经跑着一个项目再让容器映射到 8080Daemon 会直接拒绝创建这个端口转发。排查方法Windows 下用管理员 PowerShellnetstat -ano | findstr 8080输出最后一列是占用端口的进程 PID再执行taskkill /PID 12345 /F就可以把占用进程结束掉。或者你在启动容器的时候换个映射端口比如-p 8081:80改成 8081 再起容器。如果是 Docker Daemon 自己的端口被占用比如 2375通常说明你之前起过别的服务占用了 Docker 的通信端口这会导致 Docker Desktop 在启动阶段就异常。处理方法一样先 netstat 找到占用进程结束后再启动 Docker Desktop。这个问题的本质是端口冲突排查链路比前几个简单但出现频率很高尤其是开发机里跑了一堆本地服务的场景。6. 初始化配置建议磁盘位置、资源上限与账号登录Docker Desktop 装好、加速配好之后别急着开始敲命令。下面这三件事顺手做完能帮你省掉未来很多隐性问题。6.1 把虚拟磁盘移出 C 盘Windows 上跑 Docker Desktop 时间一长C 盘空间会越来越小因为 WSL2 的虚拟磁盘文件vhdx默认放在 C 盘用户目录下。你经常拉大镜像、跑数据量大的容器磁盘文件能膨胀到十几个 GB 甚至更多。想把它挪到其他盘思路是用 wsl 的导出导入功能。操作前先退出 Docker Desktop然后打开管理员 PowerShellwsl --shutdown wsl -l -v先看清楚 WSL2 里有哪几个发行版。常见的是 docker-desktop 和 docker-desktop-data 这两个。以 docker-desktop-data 为例导出再导入的命令大致是wsl --export docker-desktop-data D:\docker-desktop-data.tar wsl --unregister docker-desktop-data wsl --import docker-desktop-data D:\docker-desktop-data D:\docker-desktop-data.tar --version 2注意wsl --unregister会删除这个发行版里的所有数据操作前务必确认 Docker Desktop 里没有未保存的容器数据。不同 Docker Desktop 版本管理的发行版名称可能不同以wsl -l -v的实际输出为准。做完这一步C 盘能释放出一大截空间对空间紧张的人非常实用。Mac 上就没这么麻烦了。Docker Desktop 的镜像存储位置可以直接在 Settings Resources Advanced 里改选一个空间大的目录点 Apply 即可。6.2 给 Docker Desktop 设置合理的资源上限Docker Desktop 默认的资源配额在某些机器上偏保守在某些机器上又过于激进。最合理的做法是自己根据开发机配置来调。Windows 上在 Settings Resources Advanced 里调Mac 上在 Settings Resources 里调。我的个人经验16GB 内存的开发机给 Docker 分 4GB 到 6GB32GB 内存的机器可以给到 8GB。CPU 按需给但别把所有核心都塞给 Docker留几个核给操作系统和 IDE不然容器一跑起来整个电脑会卡成幻灯片。磁盘镜像大小上限也要提前看一眼如果你的项目会生成大量数据默认值可能不够用后面改起来比现在麻烦。6.3 登录 Docker Hub 账号减少镜像拉取限制Docker Hub 对未登录用户有镜像拉取频率限制。如果你经常拉镜像一段时间内拉了太多层会被临时限流报错信息往往是 rate limit 相关的内容。解决方式很简单注册一个免费的 Docker Hub 账号然后在 Docker Desktop 右上角 Sign in 登录。这里要分清楚登录解决的是拉取频率限制问题镜像源加速解决的是下载速度和稳定性问题两者是互补关系不能互相替代。你既需要镜像加速来提速也需要登录账号来避开限流。我在 Windows 11 和 Apple Silicon 的 Mac 上都装过 Docker Desktop踩过 BIOS 虚拟化关闭、WSL2 内核版本不匹配、镜像站失效、containerd 解析报错这些坑。最大的体会就是Docker Desktop 的安装本身半小时之内都能搞定真正让你崩溃的全是环境前置条件。所以如果你正卡在某一步别急着卸载重装按第 5 章的顺序来先看虚拟化、再看 WSL2、再看镜像加速基本都能救回来。等你把这些走通之后回头看Docker Desktop 其实是个非常顺手的工具——配好镜像源加速之后docker pull一条命令下去几秒钟镜像就下来了后面的开发体验才算是真正顺起来。
返回列表