
不是我说Windows 上装 Docker 这件事看着简单真正动手的时候一堆人卡在第一步。要么是虚拟化没开要么是 WSL 2 内核没装好要么是 Docker Desktop 起来了但 docker ps 就是报错。这篇文章我就按自己实际装过无数遍的经验把从环境检查、安装、验证到日常排坑的完整过程捋一遍你照着走基本不会再被卡住。先说这东西到底能干什么。在 Windows 上装 Docker不是为了拿它当虚拟机玩而是让你能在本地跑 Linux 容器把开发环境、中间件、数据库、甚至是整套微服务都装进容器里做到“代码在哪跑环境就在哪跑”。适合谁适合后端开发、前端要模拟后端服务、运维要做本地验证、还有刚接触容器想入门的人。下面进入正题。1. 安装前先把环境底子打牢1.1 你的 Windows 版本够不够格Docker Desktop 对 Windows 版本有硬性要求不是随便一台机器都能装。官方的要求是 64 位的 Windows 10 版本 2004也就是 20H1及以上或者直接上 Windows 11。如果你还在用 Windows 7 或者老旧的 Windows 10 1803、1903那我劝你先别折腾 Docker Desktop 了要么升级系统要么老老实实用虚拟机里的 Linux。怎么看自己的版本按 Win R输入winver回车弹窗里会显示完整的版本号。只要这个版本号低于 2004建议先去 Windows 更新里把系统补丁打全。这里有个容易忽视的点很多人系统常年不更新版本号虽然是 2004 以上但缺少最新的累积更新WSL 2 的内核组件装不上去后面 Docker Desktop 启动会一直转圈。所以装 Docker 之前先把 Windows Update 跑一遍省得后面踩坑。另外要注意这里是 64 位系统的要求。如果你用的是 32 位 Windows或者 ARM 版 Windows 的老设备Docker Desktop 的支持情况差别很大不建议直接按常规方式装。就我实测来说现在主流笔记本基本都是 64 位这个检查只是让你心里有数。1.2 虚拟化支持检测与开启Docker Desktop 配合 WSL 2 使用时依赖 Windows 的虚拟化平台功能。这一步没做好后面启动时会报“please enable the Virtual Machine Platform”之类的错误。怎么检测打开任务管理器切到“性能”标签看右下角 CPU 那一块的“虚拟化”状态。如果显示“已启用”那没问题如果是“已禁用”需要进入 BIOS/UEFI 设置里把 Intel VT-x对 Intel或 AMD-V/SVM对 AMD打开。不同品牌主板的 BIOS 入口不一样但一般都在“Advanced”或“CPU Configuration”这类菜单下找到一个叫 Intel Virtualization Technology 或 SVM Mode 的选项设为 Enabled保存退出即可。这里我多说一句很多人以为开了 BIOS 虚拟化就万事大吉其实 Windows 侧还有一道开关。你需要在“启用或关闭 Windows 功能”里勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”。操作路径是控制面板 - 程序 - 启用或关闭 Windows 功能勾选后点确定系统会提示重启。注意这两项必须同时勾选只选一个的话WSL 2 引擎起不来Docker 也会跟着罢工。还有一个特殊情况如果你机器上装了 Hyper-V而且 Hyper-V 的版本是 Windows 10 家庭版那种阉割版可能会和 WSL 2 产生冲突。在实际操作中Docker Desktop 现在的默认后端就是 WSL 2它和 Hyper-V 可以共存但如果你之前手动开启过 Hyper-V 又没配好建议先把它相关的功能项重置一遍再看。1.3 为什么选 Docker Desktop 而不是别的方案在 Windows 上跑容器其实不止 Docker Desktop 一条路。有人直接装一个 Ubuntu WSL然后在 WSL 里装 Docker Engine不用 Docker Desktop也能跑容器。还有用 Podman、Rancher Desktop 的各有各的优点。但对我来说Docker Desktop 还是首选原因有三点。第一它自带图形界面容器状态、镜像列表、日志、资源占用全部可视化对新手和需要快速定位问题的人来说非常直观。第二它对 Windows 和 WSL 2 的集成做得最成熟文件共享、端口映射、挂载目录这些都是开箱即用不像手动在 WSL 里配 Docker 还要自己解决 Windows 磁盘和 WSL 文件系统之间的转换问题。第三Docker Desktop 直接支持 Docker Compose 一键启动多容器项目这在本地做微服务联调的时候特别省事。当然也有不选它的理由。Docker Desktop 在大版本更新后对商业用途有许可证限制如果你是在公司环境作为开发主力工具需要先确认企业授权是否合规。另外它的资源占用不算低尤其内存 8GB 以下的机器跑大镜像时容易卡。这时候可以考虑 WSL 2 里手动装 Docker Engine 的轻量做法但前提是你对 Linux 命令足够熟悉不然排障成本会很高。2. 安装 Docker Desktop 的完整流程2.1 下载安装包与安装选项下载 Docker Desktop 安装包直接去官网的下载页面拿就行选择 Windows 版本的安装包一般是 exe 文件。下载下来之后双击运行安装向导会问你几个选项这里我给一套我平时用的推荐配置。第一安装路径建议保持默认除非你的 C 盘空间实在紧张。Docker Desktop 本身不算大但它底层的 WSL 数据文件会占不少空间这几个数据文件默认放在用户目录下不能直接在安装时改到 D 盘。所以与其改安装路径不如在装完以后通过配置迁移 WSL 数据文件的位置这个我后面专门讲。第二安装向导可能会让你勾选“使用 Windows 容器而不是 Linux 容器”之类的选项。我的建议是不要勾选保持默认的 Linux 容器模式。绝大多数镜像和项目都是 Linux 容器Windows 容器只在特定企业场景下才会用到你如果勾选错了后面跑 nginx、mysql 这种镜像都会报“image operating system linux cannot be used on this platform”很麻烦。第三是否创建桌面快捷方式这个看个人习惯我建议勾选因为 Docker Desktop 启动和重启的频率不低有个快捷方式方便很多。安装过程一般需要几分钟中途可能会要求重启系统这很正常重启之后继续后面的步骤。2.2 WSL 2 内核升级与配置现在大部分机器装好 Docker Desktop 后它会引导你安装或更新 WSL 2 内核但你最好在装 Docker 之前就先把 WSL 准备好。用管理员身份打开 PowerShell执行wsl --status看一下当前 WSL 的版本状态。如果提示没有安装 WSL直接执行wsl --install这个命令会自动装好 WSL 的核心组件和默认的 Linux 发行版。如果已经装过 WSL 1需要升级到 WSL 2用wsl --set-version 发行版名称 2来转换。这里有个细节Docker Desktop 其实不强制你安装某个 Linux 发行版它用的是自己内置的 WSL 2 发行版。但wsl --update这个动作最好在装 Docker 之前手动跑一次把 WSL 内核更新到最新版。否则 Docker Desktop 启动时可能会卡在“Docker Desktop requires a newer WSL kernel version”这一步。还有一个检查点是默认 WSL 版本。执行wsl --set-default-version 2确保以后新建的发行版默认用 WSL 2。因为 WSL 1 的文件系统和访问速度都不如 WSL 2Docker 官方默认也只是支持 WSL 2 后端。如果你之前装过 Ubuntu 之类的微软商店发行版还可以用wsl -l -v查看每个发行版的运行状态。Docker Desktop 启动后会在后台自动拉起一个docker-desktop发行版这个不用你自己管只要 WSL 整体健康它就能正常启动。2.3 首次启动初始化配置安装完成并重启后启动 Docker Desktop。第一次启动会有一个初始化过程界面会显示鲸鱼图标转圈这个时候它正在初始化 WSL 2 后端和 Docker Engine需要一点耐心。首次启动可能会弹出一份用户协议点接受。然后会问你使用何种容器引擎选默认的 Linux 容器即可。有些新版本还会要求登录 Docker Hub 账号理论上可以跳过但如果你之后要拉取私有仓库镜像还是注册一个号方便。等鲸鱼图标稳定下来不再转圈界面左侧菜单里能看到 Containers、Images、Volumes 这些选项的时候说明 Docker Engine 已经起来了。但界面起来了不代表所有功能都正常我一般会立刻打开终端跑一条docker version看到 Server 部分有版本号而不是报错才算是真正装好了。这里顺便提一个容易踩的坑有些机器装了 Docker Desktop 之后终端里输docker提示找不到命令。这是因为 Docker Desktop 没有把 CLI 工具加到当前终端的 PATH 里或者终端缓存没刷新。解决办法是重开一个终端如果还不行检查 Docker Desktop 设置里是否勾选了“在终端中启用 Docker CLI 集成”相关的选项。正常情况下安装过程会自动配置好不用手动改 PATH。3. 验证安装跑起第一个容器3.1 先看 docker version 和 docker info装完第一件事不是急着跑容器而是先确认客户端和服务端都活着。打开终端PowerShell 或 CMD 都行输入docker version正常情况下你会看到 Client 和 Server 两段输出。Client 是 docker CLI 的版本信息Server 是 Docker Engine 的信息。如果 Server 部分缺失或者提示error during connect: ...说明 Docker Engine 没有正常运行这时候去看 Docker Desktop 的鲸鱼图标是不是红色的图标变红或者一直转圈多半是 WSL 2 或虚拟化的问题。接着跑docker info可以看到更多运行时信息比如容器的存储驱动器、CPU 数量、内存限制、镜像数量等。特别留意一行Operating System正常在 Windows 上通过 WSL 2 后端运行时这里会显示类似 Docker Desktop 的内置 Linux 系统而不是 Windows。如果你发现显示的是 Windows 相关字样说明当前引擎切到了 Windows 容器模式需要到 Docker Desktop 设置里切回 Linux 容器。这两条命令是日常排查的基础。以后不管遇到什么问题先docker version看引擎活没活再docker info看配置再docker ps看容器状态这个顺序能帮你快速定位是环境问题还是容器问题。3.2 跑 hello-world第一次拉取与运行确认引擎正常后跑经典验证命令docker run hello-world这条命令的逻辑是先在本地找有没有 hello-world 镜像没找到就去配置的镜像仓库拉取拉取成功后创建容器并运行运行完输出一段说明文字后退出。我第一次在 Windows 上跑这个的时候拉取等了好一会儿因为当时镜像加速没配置官方仓库的访问速度很感人。如果你也遇到长时间卡在 “Unable to find image” 后面不要反复重试先去看第 4 节里的镜像加速配置。配好加速之后hello-world 基本几秒就能跑完。还有一个常见报错值得说no matching manifest for windows/amd64 in the manifest list entries。这个错误十有八九是当前 Docker 引擎处于 Windows 容器模式。解决办法就是到 Docker Desktop 的托盘图标右键选择 “Switch to Linux containers”等引擎重启后再重新跑。hello-world 跑通后说明镜像拉取、容器创建、运行、退出这条链路没有问题可以进入下一步的端口映射验证。3.3 用 nginx 验证端口映射和文件挂载hello-world 只验证了基础能力但日常开发中最常用的其实是端口映射和文件挂载。这一步我用 nginx 来验证。先跑一个最简单的前台容器docker run -d -p 8080:80 --name web-test nginx参数解释-d是后台运行-p 8080:80把容器内的 80 端口映射到宿主机的 8080 端口--name web-test给容器起个名字nginx是镜像名。跑完后浏览器访问http://localhost:8080能看到 nginx 的欢迎页端口映射就验证通过了。然后你可以顺手验证一下容器日志docker logs web-test能看到 nginx 的访问日志和启动日志。测试完清理容器docker stop web-test docker rm web-test再往下文件挂载是很多 Windows 用户崩溃的地方。Windows 的目录路径和 Linux 容器里的路径格式不一样挂载命令要写成这样docker run -d -p 8080:80 -v D:/docker-test:/usr/share/nginx/html:ro --name web-mount nginx把宿主机的D:\docker-test挂载到容器里的/usr/share/nginx/html:ro表示只读。Windows 路径用正斜杠或者反斜杠都可以在 Docker Desktop 里被识别但建议统一用正斜杠避免转义问题。你可以在D:\docker-test里放一个自己的 html 文件刷新浏览器如果看到自己的内容替换了 nginx 默认页面说明文件挂载也正常了。这一步验证对于后续开发特别重要因为你在 Windows 上改代码容器里要能实时看到变化全靠挂载实现。如果挂载不生效检查 Docker Desktop 的共享磁盘设置有些版本需要在设置里显式允许磁盘共享。4. 日常使用中的坑与排查思路4.1 镜像拉取慢的加速配置镜像拉取慢是我见过最多的问题尤其是刚装好的时候。解决办法是配置镜像加速器。Docker Desktop 的配置入口在 Settings - Docker Engine这里可以看到一份 JSON 配置文件。在 JSON 里加上这样一段{ registry-mirrors: [ https://你的加速服务地址 ] }配置好镜像加速器一般是有资质的云服务商提供的公共加速服务。保存后 Docker Desktop 会自动重启引擎。改完之后可以用docker info查看找到Registry Mirrors一项确认加速地址已经生效。这里要特别说明两个容易犯的错。第一JSON 格式别写错漏逗号、多括号都会导致 Docker Engine 启动失败。改之前最好把原始内容复制一份备份。第二加速配置不保证所有镜像都能加速。一些比较冷门或者特定区域的镜像可能仍然很慢这时候只能耐心等待或者考虑其他方式。我在实际使用中还有个习惯会把经常用的基础镜像先手动拉一遍比如docker pull alpine、docker pull alpine:latest。这样以后构建项目镜像时基础层直接从本地取节省大量时间。如果你发现拉取小镜像都特别慢基本就是加速没配好而不是网络问题。4.2 磁盘空间被 WSL 数据文件吃满用几个月后Docker Desktop 会悄悄占用大量磁盘空间而且系统会越来越卡。原因在于 WSL 2 的动态虚拟磁盘文件vhdx会随着容器和镜像的增加而膨胀关键是它只增不减即使你删了镜像、清空容器那个文件也不会自动缩小。怎么查打开 WSL 的发行版目录一般在%LOCALAPPDATA%\Docker\wsl这个路径下你会在里面看到几个很大的 vhdx 文件。要清理磁盘空间最直接的方法是先清掉不需要的镜像和容器然后压缩 vhdx。压缩 vhdx 需要用到 diskpart 工具操作步骤是退出 Docker Desktop然后打开管理员 CMD执行以下命令diskpart select vdisk fileC:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit这里注意路径要换成你自己机器上的实际路径。压缩过程可能需要几分钟期间尽量不要动其他程序。我操作下来一般能把几个 G 的磁盘空间释放出来效果很明显。日常预防大于治疗建议养成两个习惯。一是定期执行docker system prune清理悬空镜像和停止的容器这个命令会释放一部分独立于 vhdx 的空间二是如果项目本身不大可以限制 Docker Desktop 的资源使用在 Settings - Resources 里把内存和 CPU 限制调低一点这样底层虚拟磁盘的增长会慢一些。4.3 Docker Desktop 启动失败或引擎反复重启Docker Desktop 启动失败问题多数出在 WSL 2 和虚拟化链路上。常见的提示有几种。一种是 “Docker Desktop requires a newer WSL kernel version”。解决办法是管理员 PowerShell 执行wsl --update更新完成后重启 Docker Desktop。另一种是 “WSL 2 installation is incomplete”这个也是 WSL 内核没有正确安装或者在 Windows 功能里“虚拟机平台”没开。按第 1 节的方法重新确认两项功能是否勾选再跑一遍wsl --update基本能解决。还有一种情况是 Docker Desktop 反复重启界面一直加载不出来。这种我遇到过几次排查思路是先打开 PowerShell 执行wsl -l -v看 docker-desktop 相关的发行版是否已经停止。如果它处于 Stopped 状态手动执行wsl --shutdown把所有 WSL 发行版关掉然后再启动 Docker Desktop让它重新初始化。实在不行还可以删掉 Docker Desktop 的配置缓存目录。路径在%APPDATA%\Docker把settings-store.json和settings.json备份后删除再重启 Docker Desktop它会用默认配置重新初始化。用这招之前先确认你的虚拟化没问题否则删完配置照样启动不了。还有一个小技巧查看 Docker Desktop 日志。日志路径在%LOCALAPPDATA%\Docker里面有log.txt或者host目录下的日志文件报错的具体原因基本都能在里面找到。虽然日志内容比较啰嗦但精确定位到报错时间附近的几行就能看出是网络问题、镜像问题还是引擎崩溃。4.4 端口冲突与容器间通信本地跑多个容器时会遇到端口被占用的情况。比如你启动一个映射到 8080 端口的容器提示 “port is already allocated”说明宿主机 8080 已经被某个进程或者其他容器占用了。先查端口占用执行netstat -ano | findstr :8080看是谁占了然后去任务管理器结束对应进程或者直接换一个宿主机端口比如-p 8081:80问题就解决了。容器之间的通信是另外一个容易困惑的点。同一个自定义网络里的容器可以用容器名互相访问。比如用 docker-compose 定义的服务服务名就是容器在内部网络里的 hostname。你要把后端容器访问数据库的地址配置成数据库服务名:3306而不是localhost:3306因为在 Docker 网络中每个容器都有自己独立的 localhost。这些细节虽然不是安装阶段的问题但装好了 Docker 之后一定会遇到提前了解能省不少排查时间。我见过不少同事Docker 环境本身没问题却在端口冲突和容器网络配置上浪费了大半天。5. 个人经验与实用建议装 Docker 这事的难度不在于“下一步下一步”安装而在于你对容器运行原理和环境依赖的理解。整个流程我走过不下几十遍有几条个人经验想特别说一下。第一在任何 Windows 机器上装 Docker优先级永远是先确认虚拟化、先升级 WSL 2再装 Docker Desktop。顺序反了你会花费大量时间去排查各种奇怪报错而这些问题其实都是一开始环境没准备好造成的。第二配合 Docker Compose 能省掉 80% 的手动配置。为项目写一个 docker-compose.yml把数据库、Redis、后端服务全部编排进去一条docker compose up -d就把整个环境拉起来了。它比手动docker run更易于维护尤其是在多容器场景下环境的一致性会好很多。第三镜像和容器的清理要成为习惯。Docker 很强大也是最容易把本地磁盘搞爆的工具。我给自己定的规则是每周跑一次docker system prune -a把不长用的镜像清掉定期用前文提到的 vhdx 压缩方法释放磁盘。这比等到磁盘报警再亡羊补牢要舒服得多。第四不要拿 Docker Desktop 当生产环境用。它的定位是本地开发与测试要部署到服务器时请用专门的 Linux 环境跑 Docker Engine否则性能和稳定性都会有问题。做好本地与生产环境的一致性才是 Docker 最大的价值。最后我再分享一个细节如果你经常一边跑 Docker一边开着大量其他程序可以去 Docker Desktop 的 Settings 里把内存限制调高一点默认配置对很多机器来说是偏保守的。但也要看自己的内存总量来调别把内存全部分给 Docker不然宿主机反而会卡。按照这个流程操作下来Windows 上跑 Docker 基本就是十分钟内的事。真正花时间的是你后续怎么用好容器怎么编排出适合自己项目的环境。环境装好了后面每一步都会顺畅很多。