1. 为什么 Win11 上装 Docker Desktop 值得单独写一篇
如果你最近刚重装完 Win11,或者正准备把开发环境从 Mac、Linux 迁到 Windows,大概率会碰到同一个问题:Docker Desktop 装是装上了,但启动就报错,或者拉镜像慢到让人怀疑人生。更让人头疼的是,网上大量教程还停留在 Win10 时代,步骤和现在的 Win11 24H2、25H2 对不上,照着做反而容易把系统搞乱。
这篇内容就是来解决这个问题的。我会把 Win11 上从零安装 Docker Desktop 的完整链路拆开讲清楚,包括 WSL2 的安装与验证、Docker Desktop 的下载与配置、国内镜像源的设置、常见启动报错的排查,以及装完之后怎么验证环境真的可用。关键词覆盖Win11、Docker Desktop、WSL2、镜像源,适合完全没有接触过容器的新手,也适合装过但被各种报错卡住的老手。
先说一个反直觉的结论:Docker Desktop 在 Win11 上能不能跑起来,八成不取决于 Docker 本身,而取决于 WSL2 和虚拟化有没有配对。很多人一上来就下载安装包双击,结果卡在 “Virtualization support not detected” 或者 “Docker Desktop failed to start because virtualisation support wasn't detected”,然后开始怀疑是不是系统版本不对、是不是要重装系统。其实绝大多数情况下,问题出在 BIOS 里的虚拟化开关没开,或者 WSL2 的内核组件没装全。
我自己的主力开发机是一台 Win11 台式机,SSD 从 500G 换到 2T 的时候做过一次系统迁移,迁移完之后 Docker Desktop 直接罢工,排查了大半天才发现是 WSL2 的发行版状态异常。这类经验网上教程基本不会写,但实际工作中特别容易遇到。所以这篇不只是“下一步下一步”的安装指南,我会把每个步骤背后的原因、容易踩的坑、以及验证方法都讲透。
下面按实际操作的顺序展开,你可以从头跟着做,也可以直接跳到卡住的那一步。
2. 装 Docker Desktop 之前,先把 WSL2 这条地基打牢
2.1 WSL2 到底是什么,为什么 Docker Desktop 非它不可
WSL 是 Windows Subsystem for Linux 的缩写,直译过来就是“Windows 下的 Linux 子系统”。WSL2 是它的第二代版本,和第一代最大的区别在于:WSL1 是把 Linux 系统调用翻译成 Windows 调用,而 WSL2 直接跑了一个轻量级的虚拟机,里面是真正的 Linux 内核。
这个区别对 Docker 来说非常关键。Docker 依赖 Linux 内核的 namespace 和 cgroup 能力来做容器隔离,WSL1 翻译层做不到完整支持,所以 Docker Desktop 在 Win11 上默认走 WSL2 后端。你可以把 WSL2 理解成“Windows 里藏了一台几乎无感的 Linux 小电脑”,Docker 的容器就跑在这台小电脑里。
那为什么不直接用 Hyper-V 虚拟机?因为 WSL2 的启动速度、内存占用、文件系统互通性都比传统虚拟机好太多。实测下来,WSL2 启动一个 Ubuntu 发行版大概两三秒,而 Hyper-V 冷启动要十几秒。Docker Desktop 选择 WSL2 作为默认后端,就是看中了这个体验。
2.2 检查虚拟化是否开启:这一步不过,后面全白搭
在装任何东西之前,先确认 CPU 虚拟化已经打开。打开任务管理器,切到“性能”标签页,点 CPU,看右下角有没有“虚拟化:已启用”。如果显示“已禁用”,你需要重启进 BIOS 打开它。
不同主板进 BIOS 的按键不一样,常见的是 Del、F2、F10、Esc。进去之后找 “Intel Virtualization Technology”(Intel 平台)或者 “SVM Mode”(AMD 平台),把它设成 Enabled。保存退出后回到系统再确认一次。
注意:有些品牌机(尤其是笔记本)的 BIOS 里虚拟化选项藏得比较深,可能在 Advanced 或者 CPU Configuration 子菜单下。如果实在找不到,可以搜“你的机型 + 开启虚拟化”,一般都有对应说明。
这一步为什么重要?因为 WSL2 本质是虚拟机,没有硬件虚拟化支持它根本起不来。Docker Desktop 启动时报的 “Virtualization support not detected” 就是这个原因。很多人以为是 Docker 的问题,其实是 BIOS 层面的开关没开。
2.3 用一条命令装好 WSL2 和 Ubuntu
Win11 现在装 WSL2 比几年前简单太多了。以前要手动开“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能,还要单独下载内核更新包。现在一条命令搞定。
以管理员身份打开 PowerShell 或者 Windows Terminal,输入:
wsl --install这条命令会自动做几件事:启用 WSL 和虚拟机平台功能、下载最新版 WSL2 内核、安装 Ubuntu 作为默认发行版。执行完之后重启电脑。
重启后系统会自动弹出 Ubuntu 的初始化窗口,让你设置用户名和密码。这个用户名密码是 Linux 子系统里的,和 Windows 账户无关,自己记住就行。
如果你想要指定发行版,比如 Ubuntu 22.04,可以这样:
wsl --install -d Ubuntu-22.04装完之后用下面这条命令确认状态:
wsl --list --verbose正常输出应该类似这样:
| NAME | STATE | VERSION |
|---|---|---|
| Ubuntu-22.04 | Running | 2 |
关键看 VERSION 那一列,必须是 2。如果是 1,说明还在用 WSL1,需要手动转换:
wsl --set-version Ubuntu-22.04 22.4 WSL2 装完后的两个必做检查
第一个检查是内核版本。在 Ubuntu 终端里执行:
uname -r应该看到类似5.15.x或更高的版本号。如果版本号特别低,说明内核没更新,可以执行wsl --update来升级。
第二个检查是网络。WSL2 默认走 NAT 网络,和 Windows 主机共享网络出口。在 Ubuntu 里 ping 一下外网:
ping -c 3 www.baidu.com能通就说明网络没问题。如果 ping 不通,多半是 DNS 配置的问题,可以检查/etc/resolv.conf。
提示:WSL2 的发行版默认不会自动保活,长时间不用会被挂起。如果你希望它一直运行,可以在 Windows 端设置
wsl --manage Ubuntu-22.04 --set-sparse false,或者用任务计划定期唤醒。不过对 Docker Desktop 来说,它会自己管理 WSL2 实例,一般不用手动干预。
3. Docker Desktop 的下载、安装与首次启动
3.1 下载渠道的选择:官网直连还是镜像加速
Docker Desktop 的官方下载地址是https://www.docker.com/products/docker-desktop/。点进去之后选择 Windows 版本,下载的是一个.exe安装包,大概 500MB 左右。
问题在于,国内直接访问官网下载速度可能很慢,甚至断连。这时候有两个思路:一是找国内镜像站提供的安装包,二是用下载工具多线程拉。我个人更推荐第一种,因为安装包本身不涉及敏感内容,国内不少高校和企业镜像站都有同步。
下载的时候注意选对架构。Win11 现在基本都是 x64,如果你用的是 ARM 设备(比如某些 Surface Pro X),要选 ARM64 版本。选错了装不上。
3.2 安装过程中的选项怎么勾
双击安装包,第一个界面会让你选“Use WSL 2 instead of Hyper-V”还是“Use Hyper-V”。默认选 WSL2,不要动。这是 Win11 上的推荐配置,性能更好,资源占用更低。
接下来会问要不要把 Docker Desktop 加到 PATH,建议勾上。这样你在 PowerShell 里可以直接敲docker命令,不用切到 Docker Desktop 的界面。
安装完成后会提示重启,重启是必须的,因为要加载 WSL2 相关的系统组件。
3.3 首次启动:接受协议、跳过登录、验证引擎
重启后打开 Docker Desktop,会先弹服务协议,接受即可。然后它会让你登录 Docker Hub 账号,这一步可以跳过,不登录也能用本地容器功能。
跳过登录后,Docker Desktop 会开始启动引擎。这时候注意看左下角的状态指示:绿色表示运行中,黄色表示正在启动,红色表示出错。
如果卡在黄色很久,或者直接变红,先别急着重装。打开 PowerShell 执行:
docker version如果输出里能看到 Client 和 Server 两部分信息,说明引擎其实已经起来了,只是界面状态没刷新。如果只看到 Client 没有 Server,那才是真的没起来。
再执行一条更直观的:
docker run hello-world这条命令会拉取一个极小的测试镜像并运行。如果看到 “Hello from Docker!” 的输出,恭喜你,环境通了。
3.4 启动失败的常见原因速查
| 报错信息 | 大概率原因 | 处理方式 |
|---|---|---|
| Virtualization support not detected | BIOS 虚拟化未开 | 重启进 BIOS 开启 |
| WSL2 kernel version too low | WSL2 内核过旧 | 执行wsl --update |
| Docker Desktop failed to start because virtualisation support wasn't detected | 虚拟化功能被其他软件占用 | 关闭 Hyper-V 冲突项或重启 |
| Port already in use | 端口被占用 | 检查 2375/2376 端口 |
| WSL distro not found | WSL2 发行版异常 | 重装 WSL2 发行版 |
这张表建议截图保存,装的时候遇到报错直接对照。
4. 镜像源配置:让拉镜像从龟速变飞起
4.1 为什么默认拉镜像那么慢
Docker Hub 的服务器在海外,国内直接拉镜像经常只有几十 KB/s,一个几百 MB 的镜像能拉半小时。这不是 Docker 的问题,是网络链路的问题。解决办法就是配置国内镜像源,让拉取请求走国内的缓存节点。
镜像源的工作原理其实很简单:它定期从 Docker Hub 同步热门镜像,你在本地配置了镜像源之后,Docker 会优先从镜像源拉,拉不到再回源到官方。所以热门镜像基本秒拉,冷门镜像可能还是要走官方。
4.2 Docker Desktop 里配置镜像源的两种方式
第一种是图形界面配置。打开 Docker Desktop,点右上角齿轮图标进入 Settings,找到 Docker Engine 选项卡。里面是一个 JSON 配置框,找到registry-mirrors字段,填入镜像源地址。
第二种是直接改配置文件。配置文件在C:\Users\你的用户名\.docker\daemon.json,用文本编辑器打开,写入:
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://mirror.baidubce.com" ] }保存后重启 Docker Desktop 生效。
注意:镜像源地址会随时间变化,有些会失效。建议一次配两到三个,Docker 会按顺序尝试。如果某个源长期不可用,及时从列表里删掉,否则每次拉镜像都要等它超时。
4.3 验证镜像源是否生效
配置完之后,执行:
docker info在输出的最后部分找Registry Mirrors,如果列出了你配置的地址,说明生效了。
然后拉一个稍微大一点的镜像测试速度,比如:
docker pull nginx:latest对比配置前后的耗时,一般能从几分钟降到十几秒。
4.4 WSL2 内部的镜像源也要单独配
这里有个很多人忽略的点:Docker Desktop 的镜像源配置只管 Docker 引擎,WSL2 里 Ubuntu 系统自己的 apt 源是另一套。如果你要在 WSL2 里直接apt install装东西,也需要换源。
编辑/etc/apt/sources.list,把默认的archive.ubuntu.com替换成国内镜像站,比如清华源或阿里源。改完之后执行:
sudo apt update sudo apt upgrade这一步不是必须的,但如果你打算在 WSL2 里做开发(比如跑 Python、CUDA),换源能省很多时间。
5. 装完之后怎么用:从 hello-world 到实际开发环境
5.1 确认 Docker 和 WSL2 的协作关系
装好之后,建议先理解一下 Docker Desktop 和 WSL2 是怎么配合的。Docker Desktop 会在 WSL2 里创建两个特殊的发行版:docker-desktop和docker-desktop-data。前者跑 Docker 引擎,后者存镜像和容器数据。
用这条命令可以看到它们:
wsl --list --verbose你会看到除了自己装的 Ubuntu,还多了这两个。不要手动去动它们,删了会导致 Docker 数据丢失。
5.2 在 WSL2 里直接用 docker 命令
Docker Desktop 装好之后,WSL2 的发行版里也能直接用docker命令,不需要额外安装。这是因为 Docker Desktop 把 CLI 和 socket 都挂载到了 WSL2 里。
在 Ubuntu 终端里执行:
docker ps如果能正常输出表头,说明 WSL2 和 Docker 引擎的通道是通的。这个特性对开发特别有用,你可以在 WSL2 里写代码、跑容器,文件系统性能比在 Windows 侧挂载好很多。
5.3 跑一个真实点的例子:Nginx + 挂载目录
光跑 hello-world 不够直观,来跑一个 Nginx 并挂载本地目录:
docker run -d -p 8080:80 --name my-nginx -v /home/你的用户名/html:/usr/share/nginx/html nginx然后在/home/你的用户名/html下放一个index.html,浏览器访问http://localhost:8080就能看到。
这个例子验证了三件事:端口映射正常、卷挂载正常、WSL2 文件系统互通正常。三样都通,说明你的环境已经可以支撑日常开发了。
5.4 资源限制与性能调优
Docker Desktop 默认会占用 WSL2 可用内存的一半左右。如果你机器内存不大(比如 16G),跑几个容器之后可能感觉系统变卡。可以在 Docker Desktop 的 Settings → Resources 里调整 CPU、内存、交换空间的分配。
更精细的调整可以通过.wslconfig文件来做。在C:\Users\你的用户名\下创建.wslconfig,写入:
[wsl2] memory=8GB processors=4 swap=2GB保存后执行wsl --shutdown重启 WSL2 生效。这个配置对 Docker Desktop 同样适用,因为它跑在 WSL2 里。
6. 那些教程不会告诉你的踩坑经验
6.1 系统迁移或重装后 Docker 罢工怎么办
我前面提到过,SSD 迁移之后 Docker Desktop 直接起不来。原因是 WSL2 的发行版注册信息还在,但实际数据路径变了,导致 Docker 找不到docker-desktop-data。
处理办法是先把 WSL2 里残留的发行版注销掉:
wsl --unregister docker-desktop wsl --unregister docker-desktop-data然后重启 Docker Desktop,它会自动重建这两个发行版。注意,这会清空所有本地镜像和容器,如果有重要数据要先备份。
6.2 右键菜单和 Win11 的兼容小问题
Win11 的右键菜单改成了二级折叠,有些人会把它改回 Win10 风格。这个改动本身不影响 Docker Desktop,但如果你装了一些系统优化工具,可能会误关 WSL2 相关的服务。装完 Docker 之后如果发现启动异常,先检查一下有没有被优化工具动过“虚拟机平台”和“适用于 Linux 的 Windows 子系统”这两个功能。
在“启用或关闭 Windows 功能”里确认这两项是勾选状态。如果被取消了,勾回来重启即可。
6.3 自动更新带来的意外
Win11 的自动更新有时候会在后台更新 WSL2 内核,更新完之后 Docker Desktop 可能需要重新适配。如果某天开机发现 Docker 起不来,先执行:
wsl --update wsl --shutdown然后重启 Docker Desktop。大部分更新导致的问题这样就能解决。
如果你不希望系统在你不注意的时候自动更新,可以在“Windows 更新”设置里把活跃时间调长,或者暂停更新一段时间。但完全关闭自动更新不是好主意,安全补丁还是要打的。
6.4 磁盘空间去哪了:C 盘清理思路
Docker 的镜像和容器数据默认存在 C 盘,用久了 C 盘会肉眼可见地变小。清理思路有几个:
- 在 Docker Desktop 里执行
docker system prune -a,清理未使用的镜像、容器、网络。 - 把 Docker 的数据目录迁移到其他盘。在 Docker Desktop 的 Settings → Resources → Disk image location 里可以改。
- 定期检查 WSL2 的虚拟磁盘文件大小,位置在
C:\Users\你的用户名\AppData\Local\Docker\wsl。
提示:
docker system prune -a会删除所有未被容器使用的镜像,执行前确认没有需要保留的镜像。加-a参数比不加清理得更彻底,但也更危险。
6.5 关于汉化和第三方工具的取舍
网上有 Docker Desktop 的汉化包,原理是替换界面资源文件。我的建议是:新手阶段不要装汉化。原因有两个,一是汉化包版本更新滞后,Docker Desktop 升级后可能界面错乱;二是 Docker 的英文术语本身就是行业通用语言,早点熟悉没坏处。
至于 GitHub 下载加速、npm 国内镜像源、pip 清华源这些,属于开发环境的常规优化,和 Docker 本身没有直接关系,但如果你要在容器里做 Node 或 Python 开发,提前配好能省不少事。
7. 环境验证清单与日常维护习惯
装完之后,按下面这个清单逐项确认,全部通过才算真正可用:
wsl --list --verbose显示 Ubuntu 的 VERSION 为 2。docker version同时输出 Client 和 Server 信息。docker run hello-world正常输出欢迎信息。docker info里能看到配置的 Registry Mirrors。- 浏览器能访问本地运行的容器服务(如 Nginx 的 8080 端口)。
- WSL2 里能直接执行
docker ps。
日常维护上,我自己的习惯是每周执行一次docker system prune,每月检查一次 WSL2 内核更新,每季度看一下 C 盘剩余空间。Docker Desktop 本身也会提示新版本,但不用每次更新,等一两个小版本稳定了再升,避免当小白鼠。
最后分享一个实用小技巧:如果你经常需要重建开发环境,可以把常用的镜像和配置写成一个docker-compose.yml,配合.wslconfig一起备份。换机器或者重装系统的时候,装完 Docker Desktop 直接docker compose up,几分钟就能恢复工作环境。这比每次手动敲一堆docker run命令靠谱得多。