ARTICLE DETAIL

资讯详情

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

Windows上安装Docker Desktop:从虚拟化原理到WSL2配置与避坑指南

Windows上安装Docker Desktop:从虚拟化原理到WSL2配置与避坑指南 1. 为什么Windows上装Docker要先搞懂虚拟化这条暗线Windows上装Docker这件事看起来是下载个安装包、点下一步、重启一下就完事但实际操作里翻车的人远比顺利跑起来的要多。原因很简单Docker本身是Linux生态的产物容器技术依赖Linux内核的namespace、cgroup这些机制而Windows内核并没有这套东西。所以Docker在Windows上并不是“直接跑起来”而是借助一层虚拟化在后台维护一个Linux运行环境再由这个环境去承载容器。这个逻辑一旦想清楚后面所有报错都能找到根源。1.1 Docker Desktop、WSL2 和 Hyper-V 到底是什么关系Docker Desktop是Docker官方在Windows和macOS上的桌面管理工具它把图形界面、命令行、引擎调度、镜像管理全包在一起。但真正干活的Docker引擎并不跑在Windows系统上而是跑在一个虚拟化的Linux子系统里。在Windows上Docker Desktop支持两种后端WSL2后端使用Windows Subsystem for Linux 2它基于轻量级虚拟机技术在Windows内核之上运行一个完整的Linux内核。Docker引擎就装在这个Linux发行版内部。Hyper-V后端使用微软自家的Hyper-V虚拟化平台Docker引擎运行在一个管理型虚拟机中。这里我要多说一句WSL2虽然叫“子系统”底层其实是一个真正的虚拟机只不过微软把它做得很轻和传统VMware虚拟机那种“分配显存、配置网卡、开机进BIOS”的体验完全不同。WSL2的启动时间通常在几百毫秒级别内存可以动态调整和宿主机共享文件系统看起来像一个本地目录用起来像Linux终端所以很多人在使用过程中完全感觉不到虚拟机的存在。而这种设计带来的直接后果就是如果CPU虚拟化没开漂亮的设计全都白搭。1.2 WSL2后端和Hyper-V后端实际体验差在哪里先说结论个人电脑尤其是Windows 10/11家用版系统优先使用WSL2后端。原因是WSL2的启动速度更快资源占用更可控内存可以做到按需伸缩Docker Desktop和WSL2的集成度更高文件挂载、端口转发、网络配置基本都是自动的家用版Windows默认不支持Hyper-V开启Hyper-V需要专业版或企业版而WSL2在Windows 10 21H2及以上版本连家庭版都能用Hyper-V后端更适合的是一些企业环境比如域控、Hyper-V虚拟机集群、或者明确要求Windows容器隔离的场景。如果你只是想在Windows上跑几个Linux容器做开发测试WSL2后端体验明显更好。1.3 一个容易被忽略的点Windows容器和Linux容器不是一回事装好Docker Desktop后你可能会在设置里看到“Switch to Windows containers…”这样的选项。Docker本身支持两类容器Linux容器跑在Linux内核上绝大多数镜像nginx、mysql、redis、elasticsearch都是Linux镜像Windows容器跑在Windows内核上只能运行基于Windows Server的镜像主要用于.NET Framework等Windows场景绝大多数人只需要Linux容器所以保持默认即可。但如果你哪天手滑切到了Windows容器模式会发现自己非常不适应镜像数量少、社区资料少、很多在Linux上能跑通的编排方式在Windows容器里完全行不通。遇到这种状况去Docker Desktop设置里切回Linux模式就行重启后生效。理解了以上背景你再看安装过程里的每一步就清楚自己到底在配置什么了。2. 安装前的系统检查清单漏掉任何一项后面都会翻车很多人的安装流程是下载Docker Desktop → 双击安装 → 重启 → 双击图标 → 弹窗报错。然后拿着报错满网搜索最后发现是两个月前某个安全软件把Hyper-V组件关了或者BIOS里的虚拟化开关压根没开过。与其来回折腾不如在安装前花五分钟把检查做完。这套检查我每次帮同事配环境都会走一遍顺序很重要乱序容易漏项。2.1 第一步确认CPU虚拟化真的在BIOS层面打开了Docker Desktop能不能启动第一道门槛就是CPU虚拟化。开始操作之前先打开任务管理器CtrlShiftEsc切到“性能”标签页选中左侧的“CPU”看右下角的“虚拟化”这一项如果显示“已启用”说明CPU虚拟化正常可以跳过这一步继续往下走如果显示“已禁用”你需要在重启电脑时进入BIOS/UEFI设置界面把Intel VT-xIntel平台或AMD SVMAMD平台打开不同品牌电脑进BIOS的按键不一样常见的Del、F2、F12、Esc都有可能。进了BIOS之后一般在“Advanced”或“Configuration”菜单下找到“Intel Virtualization Technology”、“VT-d”或“SVM Mode”这类选项设为Enabled保存退出。这里有个非常常见的坑很多笔记本出厂时默认关闭虚拟化尤其是商用办公机原因大概率是IT部门为了安全和管理考虑统一设置的。有的电脑BIOS里你找不到虚拟化选项不是因为不支持而是因为BIOS版本太旧或者选项被隐藏建议先把BIOS更新到最新再找一遍。2.2 第二步在Windows里启用WSL和虚拟机平台功能即使你已经在BIOS里打开了虚拟化Windows系统层面默认是不开启WSL功能的。这一步对Windows 10和Windows 11稍有区别但核心都是通过“启用或关闭Windows功能”对话框。在Windows 11或较新的Windows 10上最快的方式是直接以管理员身份打开PowerShell或CMD运行wsl --install这条命令会自动完成三件事启用“适用于Linux的Windows子系统”功能、启用“虚拟机平台”功能、下载并安装默认的WSL2内核。安装完成后系统会要求重启。如果系统版本较旧命令可能不支持那就走手动路线控制面板 → 程序 → 启用或关闭Windows功能勾选以下两项适用于Linux的Windows子系统虚拟机平台部分系统叫Virtual Machine Platform勾选后重启。等待期间可以继续做后面的检查反正重启是躲不掉的。重启以后打开PowerShell确认一下WSL的版本wsl --status重点看“默认版本”是不是2。如果不是或者提示需要更新WSL执行wsl --update之后设置默认版本为2wsl --set-default-version 2为什么必须确保是WSL2而不是WSL1因为Docker Desktop的WSL2后端依赖WSL2里的Linux内核来运行容器WSL1没有完整的Linux内核Docker引擎根本跑不起来。如果只看到WSL1安装Docker后大概率会出现各种奇怪的启动失败。2.3 第三步确认Windows版本、内存和磁盘的硬性门槛Docker Desktop的官方要求是Windows 10 64位21H2及以上版本或者Windows 11。老版本的Windows 10不是不行但兼容性问题会多很多比如缺少WSL2内核更新、TLS协议过旧导致Docker Hub连接异常等。在“运行”里输入winver看一下当前系统版本号低于21H2就先去Windows更新把系统升上去。硬件层面内存建议至少8GB。Docker Desktop本身占用大约1GB到2GB再加上你跑的容器比如MySQL、Elasticsearch、Redis全家桶4GB内存的机器很容易在启动阶段就卡死或者被系统强制关闭。磁盘方面Docker Desktop安装包不到1GB但WSL2虚拟磁盘会随着你拉取的镜像数量不断膨胀SSD至少要预留20GB空闲空间才比较从容。还有一个冷门但很重要的检查点某些安全软件会把“虚拟机平台”当作潜在威胁来拦截。当你安装完成后发现Docker Desktop启动失败检查日志显示和虚拟化相关但BIOS、Windows功能都没问题那就看看安全软件是不是把Virtual Machine Platform相关服务禁用了。这个坑我遇到过不止一次排查到最后的往往就是安全软件。3. Docker Desktop安装流程从下载到第一次点开图标系统环境准备完毕接下来是正式的安装环节。这一步本身不复杂但安装选项和首次启动的状态不同后续你需要做的调整也会完全不同。3.1 安装包获取与安装时的关键勾选项官方下载地址是Docker的官网Docker Desktop for Windows的安装包通常有两百多MB。下载时要留意自己系统架构现在基本都是x64官网首页直接下载对应的exe即可。双击安装包后会有几个值得留意的选项Use WSL 2 instead of Hyper-V保持勾选。如果之前WSL状态正常这一项会默认勾选且在安装时自动配置后端Add shortcut to desktop看你个人喜好桌面图标方便但我个人更习惯从开始菜单启动Add Docker Desktop to PATH强烈建议勾选这样你可以在任意终端窗口直接使用docker命令。如果不勾选后面每次都要去Docker Desktop自带的终端里敲命令非常难受安装过程很快正常一两分钟就能完成。装完后一般会提示你注销当前账号或者重启系统这一步别偷懒直接重启让WSL2相关的驱动和服务完成初始化。3.2 首次启动时的三种状态重启完打开Docker Desktop你可能会遇到以下三种不同的走向正常启动右下角图标变成Docker小鲸鱼的样式进入Dashboard左下角状态显示Engine running打开终端执行docker version能看到客户端和服务器版本信息。这属于最理想的情况恭喜你可以直接跳到第4节配置镜像加速了。提示WSL内核版本过旧Docker Desktop会弹出一个对话框告诉你WSL2内核需要更新并且会有一个“Update the WSL kernel”的按钮。点击它或者回到PowerShell里执行wsl --update更新完成后重启Docker Desktop即可。直接报错并退出最常见的就是接下来要说的两种错误一种和虚拟化支持检测有关另一种涉及Windows守护进程启动方式。3.3 virtualization support not detected最高频的安装失败这个报错在Docker Desktop启动时出现的概率极高完整信息大致是Docker Desktop failed to start because virtualization support wasnt detected.含义很直白Docker Desktop没有检测到虚拟化支持。但它检测不到不代表你的CPU真的不支持虚拟化更像是一个“链路断掉了”的表现。排查顺序一定要从根上捋回到任务管理器 → CPU → 虚拟化确认BIOS层面是否已启用。没启用就去BIOS打开这一步前面已经详细说过确认Windows功能里“虚拟机平台”和“适用于Linux的Windows子系统”是否都勾选了。这一步很多人会漏掉其中一个尤其是“虚拟机平台”这一项它在部分系统里不会默认开启检查WSL2内核到底装没装上。在PowerShell执行wsl --status如果提示没有已安装的发行版或者默认版本还是1执行wsl --install -d Ubuntu wsl --set-default-version 2这里安装一个Ubuntu发行版的目的有三个一是让WSL2子系统真正运行起来二是确认WSL2本身没有问题三是Docker Desktop后续可以共享这个发行版的网络和文件系统。有些教程会跳过这一步但实测下来装一个发行版再启动Docker Desktop成功率明显更高。如果以上都确认无误仍然报virtualization support not detected那就要考虑另外一种情况Windows的Hyper-V服务没有完全初始化。运行Get-Service vmcompute如果服务的Status不是Running尝试启动它Start-Service vmcomputevmcompute是虚拟机管理服务WSL2和Docker Desktop的虚拟化后端都会依赖它。某些情况下它会被安全软件手动停止启动后Docker Desktop就能正常跑了。3.4 非管理员终端启动守护进程的那个报错另一个让我印象深刻的问题是这个从某个终端窗口执行Docker命令时会碰到类似error: start the windows daemon from a non-elevated terminal; shared clients我第一次碰到这个问题时有点哭笑不得因为终端窗口明明是自己刚打开的正常终端。后来逐步排查才弄明白这个问题的出现场景通常是你之前在一个管理员权限的PowerShell或者CMD窗口里启动过Docker相关操作导致Docker的shell集成和共享客户端状态出现了错乱后续从普通权限终端执行命令时它会尝试启动Windows守护进程但检测到当前环境不是非提升权限的终端于是直接拒绝。解决方式并不复杂关闭所有管理员权限的终端窗口在Docker Desktop里把Engine状态先停止再重新启动然后用一个普通权限的终端窗口执行docker ps如果还是不行就把Docker Desktop彻底退出然后在任务管理器里结束所有和Docker相关的进程再重新启动。总体来说这个问题在Docker Desktop正常启动后极少出现更多是发生在“WSL里的Docker守护进程”和“Docker Desktop共享同一套客户端”的混合使用场景里。这里有个使用习惯的建议除非你有特定需求否则不要在管理员终端里执行Docker命令尤其是docker和docker-compose。Windows的权限模型和Linux完全不同提升权限的终端窗口和普通终端窗口对同一服务的访问方式不一样很容易踩到这种尴尬的报错。4. 安装完只是开始镜像加速、资源限制与磁盘瘦身Docker Desktop跑起来之后很多人就迫不及待地开始拉镜像。这时候你会遇到一个新的瓶颈国外镜像仓库的访问速度在部分网络环境下并不理想一个几百兆的基础镜像可能要下一整个下午甚至直接超时。这部分属于安装后的必修课配置好能省下大量时间。4.1 镜像加速地址就该这么配Docker Desktop的镜像加速配置入口在Settings → Docker Engine。你会看到一个JSON格式的配置文件正常情况下是这样的{ builder: { gc: { defaultKeepStorage: 20GB, enabled: true }, experimental: false }, experimental: false, registry-mirrors: [] }在registry-mirrors数组里填入加速地址。这里我提供一个比较稳妥的组合方式{ registry-mirrors: [ https://docker.m.daocloud.io ] }填完后点击“Apply restart”Docker Desktop会自动重启并加载新配置。之后拉取镜像时Docker会优先走加速器速度会有明显改善。如果你引入的是某些私有镜像仓库也可以在这里配置。但要注意加速器只对Docker Hub官方仓库的镜像生效对于从第三方仓库拉取的镜像比如quay.io、ghcr.io上的项目无能为力。4.2 给Docker Desktop设置CPU和内存上限Docker Desktop默认会吃掉不少宿主机资源。在WSL2模式下它会自动根据系统配置分配CPU和内存但这个“自动分配”有时候过于激进明明你只是想跑个MySQL测试它却可能给WSL2分配了宿主机一半的内存。通过Settings → Resources → Advanced你可以手动调整CPUs保留2到4个即可除非你要跑多个重量级容器Memory建议给到4GB到8GB之间具体看你总内存。16GB内存的机器给8GB是比较合理的8GB内存的机器最多给4GB再高会影响Windows本身Swap一般保持默认或设为1GB到2GB内存不够时可以做缓冲调整后同样要Apply restart。别小看这一步。如果你发现Windows整体变卡、风扇频繁起飞大概率就是Docker Desktop在后台疯狂吃资源。手动限制以后体验会稳定很多。4.3 WSL2虚拟磁盘膨胀最容易被忽视的问题这是Docker Desktop在Windows上长期使用后的通病。WSL2的磁盘镜像是一个虚拟磁盘文件路径在%LOCALAPPDATA%\Docker\wsl里面会看到docker-desktop-data这个目录里面存放着WSL2虚拟磁盘通常是一个ext4.vhdx文件。随着你不断拉取镜像、创建容器、再删除容器虚拟磁盘文件只增不减。你以为执行了docker system prune清理掉了所有无用镜像但磁盘空间并没有归还给Windows因为WSL2不会主动压缩虚拟磁盘。当你发现C盘空间越来越少Docker Desktop的磁盘占用却显示只有几个GB时就该做一次瘦身了。方法是退出Docker Desktop以管理员身份打开PowerShell执行wsl --shutdown找到ext4.vhdx文件所在目录然后用磁盘压缩工具处理它Windows自带的命令行工具就能完成压缩diskpart # 进入diskpart后 select vdisk fileC:\Users\你的用户名\AppData\Local\Docker\wsl\docker-desktop-data\ext4.vhdx compact vdisk detach vdisk exit压缩完再启动Docker Desktop大概率能释放十几个GB甚至更多的空间。这个操作我基本每个月做一次效果立竿见影。5. 实战时间用Docker Compose跑一个MySQL 8.0并让本机工具连上它光装好Docker Desktop不跑点实际的东西总觉得缺了点什么。这里我把最常见的实战场景拆开讲一遍用Docker Compose在Windows上部署一个MySQL 8.0然后让Navicat或者其他数据库客户端从宿主机连进去。这套流程非常适合Windows开发环境也最能检验你的Docker环境是否真的合格。5.1 为什么推荐用Docker Compose而不是直接docker run我自己在Windows上第一次用MySQL时直接执行了docker run一条命令把MySQL拉起来用起来确实简单。但后来发现几个问题重启电脑后容器不一定自动启动端口、密码、数据卷之类的配置全堆在命令行里时间一长就忘了想加个Redis或者Nginx命令行越来越长Docker Compose用一份YAML文件描述你要运行的多个服务一份配置文件搞定启动、停止、更新、日志查看也方便复制给别人。在Windows上Docker Desktop自带Compose插件docker compose命令直接可用不需要额外安装。5.2 编写docker-compose.yml的前前后后找一个项目目录比如D:\docker\mysql在里面新建一个docker-compose.yml这是我会常用的写法services: mysql: image: mysql:8.0 container_name: mysql8 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: testdb TZ: Asia/Shanghai ports: - 127.0.0.1:3306:3306 volumes: - ./mysql-data:/var/lib/mysql - ./mysql-config:/etc/mysql/conf.d command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_unicode_ci这里的几个点值得展开说一下端口映射为什么写成127.0.0.1:3306:3306这是为了让MySQL只监听本机回环地址Windows局域网内的其他设备无法直接连接你本机的MySQL对安全性更有好处。如果你就是想让局域网其他机器也能连过来可以去掉前面的IP限定直接写3306:3306但建议设置更复杂的密码。数据卷挂载为什么要写./mysql-data:/var/lib/mysql因为容器本身是可以随时删掉重建的一旦容器被删除里面的数据也就没了。把数据文件挂载到Windows本地目录后无论容器怎么折腾数据都留在磁盘上。第一次启动时宿主机上的mysql-data目录会自动创建并填充MySQL的数据文件这一步是自动完成的。restart: unless-stopped有什么讲究这个策略保证容器在Docker服务重启或宿主机重启后自动拉起除非你手动执行docker stop。对个人开发环境来说Windows重启后不用再手动点选启动容器很省心。在docker-compose.yml所在目录打开终端执行docker compose up -d-d表示后台运行。第一次会拉取mysql:8.0镜像镜像比较大大概500MB左右取决于你网络环境可能需要等几分钟。镜像拉完、容器启动后执行docker logs mysql8如果看到类似ready for connections的日志说明MySQL已经在容器里就绪了。5.3 从宿主机连接MySQL时容易踩的三个坑容器起来了MySQL也提示就绪了但你用Navicat连接时经常遇到以下问题。坑一Navicat版本太旧无法连接MySQL 8.0。MySQL 8.0默认使用caching_sha2_password认证方式老版本的Navicat12.x之前并不支持这个插件会直接报错。解决方式是升级Navicat到新版本或者建用户时指定使用mysql_native_passwordCREATE USER test% IDENTIFIED WITH mysql_native_password BY test123; GRANT ALL PRIVILEGES ON *.* TO test%; FLUSH PRIVILEGES;坑二连接地址写错。在Docker环境里如果你把MySQL容器运行在127.0.0.1:3306宿主机直接用127.0.0.1:3306去连是没问题的。但如果连接工具提示“can’t connect to MySQL server on 127.0.0.1”先去确认docker ps能看到mysql8容器在运行再去检查端口映射是否生效docker port mysql8正常会显示3306/tcp - 127.0.0.1:3306。如果显示空白说明容器网络配置异常检查compose文件里的ports配置后重新up。坑三字符集问题。如果不指定字符集MySQL容器默认可能不是utf8mb4导致中文字段乱码。这就是我在compose文件里加command那两行的原因。如果你已经启动了容器也可以进入容器查看当前字符集docker exec -it mysql8 mysql -uroot -p登录后执行SHOW VARIABLES LIKE character_set%;如果看到character_set_server不是utf8mb4建议修改compose配置后重建容器。注意MySQL 8.0的数据目录一旦用某种字符集初始化后期修改会有麻烦最好的办法是一开始就在compose里写清楚。跑通MySQL之后你大概就能体会到Windows上Docker的完整链路了从虚拟机、容器、镜像、数据卷到端口映射每个环节都在为最终能正常使用而服务。后续你想在这个环境里再加Redis、Elasticsearch或者GitLab无非是在同一个compose文件里多写几个service然后docker compose up -d一套流程就下来了。我个人在实际操作中的一个心得是在Windows上安装Docker Desktop并不难难的是把虚拟化的底层逻辑搞清楚。很多人卡在报错上是因为一直在看Docker的文档而忽略了Windows本身的WSL2、虚拟机平台、CPU虚拟化这些前置条件。把这层地基打牢安装和使用Docker就不再是靠运气碰而是每一步都有据可循。装完了记得把镜像加速配好有空清理一下ext4.vhdx用起来会顺心很多。
返回列表