首页 / 资讯中心 / 文章详情

Windows10 Docker 安装:WSL2 配置、排错与磁盘优化

Windows10 Docker 安装:WSL2 配置、排错与磁盘优化 ★ FEATURED ARTICLE
在 Windows10 环境下安装 Docker这件事听起来像是“下一步、下一步、完成”三步走的活儿但真正动手的人多半会在某个环节卡上一两个小时装完图标是绿的命令行敲docker version却提示连不上守护进程或者容器跑起来了想把本地的代码目录挂进去结果路径怎么写都不对再或者用了半个月C 盘莫名其妙少了几十 G。这些问题跟 Docker 本身关系不大绝大多数出在 Windows 这一层的环境配置上——虚拟化开没开、WSL2 内核更没更新、Docker 的数据盘放在哪、内存给它分了多少。这篇内容就围绕 Windows10 环境下安装 Docker 这一条主线把从系统前置条件、后端选型、安装配置、到实际跑起来之后的验证与排错完整走一遍。适合三类人看完全没接触过容器、想在本机搭个干净环境的新手装过但被各种报错劝退、想搞清楚到底哪一步出问题的半熟手以及已经在用、但磁盘和内存一直不太对劲、想把配置调顺的老用户。文中给出的命令和配置都可以直接照抄涉及参数的地方我会把“为什么是这个数”一起说清楚避免你抄完不知道改哪里。1. 装之前先想清楚Windows10 上的 Docker 到底跑在哪很多人对 Windows 上装 Docker 的理解是“装个软件”这其实是最大的认知偏差。在 Linux 上Docker 直接跟内核的命名空间和 cgroups 打交道它就是个普通的系统服务而在 Windows10 上容器跑的是 Linux 内核你的系统本身没有这个内核所以必须先造一个轻量的 Linux 运行环境出来Docker 才有地方落脚。理解这一层后面所有的报错你都能对上号。1.1 两种后端WSL2 与 Hyper-V 的取舍Docker Desktop 在 Windows10 上提供两种后端。一种是挂在 Hyper-V 上的传统虚拟机方案另一种是走 WSL2Windows Subsystem for Linux 第二代的轻量方案。这两条路的差别用生活化的说法Hyper-V 像是你在自己家里单独盖了一间房给 Docker 住墙厚、门重、启动慢但隔离彻底WSL2 则像是把客厅隔出来一块共享空间进出方便、启动快、跟宿主系统的文件互通更顺代价是边界没那么硬。现在的默认推荐是 WSL2理由很实在启动速度快一个量级空闲内存占用低不少文件系统在跨系统访问时的表现也更好。我实测过同一台机器上两种后端的冷启动时间Hyper-V 后端从点击图标到docker ps能响应普遍在四十秒往上WSL2 后端通常在十到十五秒之间。日常开发这种“一天开关十次”的场景差距非常明显。但 WSL2 也不是没有代价。它依赖一套独立的虚拟化组件对系统版本有硬性要求而且 WSL2 自己会有一个虚拟硬盘文件随着镜像和容器增多会持续膨胀需要定期维护。如果你所在的环境里已经有成熟的 Hyper-V 虚拟化体系或者你需要跑 Windows 容器注意是 Windows 容器不是 Linux 容器那 Hyper-V 后端仍然有它的位置。选择逻辑可以归纳成下面这张表对比维度WSL2 后端Hyper-V 后端冷启动速度快通常 10 到 15 秒慢通常 40 秒以上空闲内存占用较低可动态回收较高虚拟机常驻与 Windows 文件互通双向挂载方便需要共享目录配置系统版本要求需支持 WSL2 的版本需专业版及以上开启 Hyper-V家庭版可用性可用基本不可用适合场景日常开发、单机调试已有虚拟化体系、需要 Windows 容器1.2 版本门槛与前置条件自查在动手下载安装包之前先把三件事确认掉能省掉后面八成的折腾。第一是系统版本Windows10 需要 64 位且内部版本号不低于 19041也就是 2004 版本。查法很简单按下Win R输入winver弹窗里会写明版本号和内部版本号。低于这个门槛的要么升级系统要么只能用更老的方案而老方案现在体验很差后面会单独说。第二是 CPU 虚拟化。这个开关在 BIOS/UEFI 里不在系统里。检查方式有两种打开任务管理器切到“性能”页点 CPU右下角会有一行“虚拟化已启用/已禁用”或者在 PowerShell 里跑systeminfo输出末尾的 Hyper-V 相关条目会告诉你固件里的虚拟化是否开启、是否已启用第二级地址转换。如果显示已禁用重启进固件设置把它打开这一步不做后面装什么都是白搭。第三是确认你登录的账号有管理员权限。开启系统功能、安装驱动级组件都需要提权用受限账号折腾半天只会得到一堆“拒绝访问”。这三项确认完再往下走才有意义。我见过不少人拿着 1809 版本的机器硬装最后卡在 WSL2 内核那一步反复重装实际上问题根本不在 Docker。1.3 为什么不推荐老式方案早年间在 Windows 上跑 Docker主流是用一个基于虚拟机的老工具它自带一整套完整的虚拟机环境。这套东西现在还能下载到但我不建议任何人再用了。原因有三一是它跑的还是第一代文件系统方案跨系统文件读写慢到影响正常开发二是它自带的组件版本很老很多新镜像跑起来会有兼容问题三是它跟新方案在环境变量、网络配置上会打架一旦装过后面想换新方案得先清理干净。如果你的机器确实不满足新方案的门槛我的建议是优先考虑升级系统而不是退回去用老方案。升级这件事的成本是一次性的而用老方案的成本是每天都在付出的。实在不能升级的也可以只在一台满足条件的机器上做开发把容器相关的验证放在那边本地只做代码编写。2. 环境准备把系统这一层先铺平系统这层没铺平Docker 装上去一定出问题。这一节的三步是有严格先后顺序的先开虚拟化功能再装 WSL2 并升级到第二版最后才是装 Docker。顺序错了会出现“Docker 装完提示 WSL 版本过低”或者“内核组件缺失”这类看着吓人、实际很好解决的问题。2.1 开启虚拟化功能与系统组件开功能有两个入口图形界面和命令行。图形界面是控制面板 → 程序 → 启用或关闭 Windows 功能在列表里勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两项。注意名字是“虚拟机平台”不是“Hyper-V”这两个是不同的东西走 WSL2 后端只需要前者。如果你打算同时保留 Hyper-V 后端那三项都勾上。命令行方式我更喜欢因为可以一次性开完、而且不需要点来点去。以管理员身份打开 PowerShell执行下面两条dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart命令里的/norestart表示先不重启两条都跑完再手动重启一次。为什么要分开跑而不是合成一条因为合并后失败时你分不清是哪一项出的问题。跑完重启是必须的这两个功能属于内核级组件不重启不生效。注意重启之后如果你之前装过任何虚拟机软件可能会出现“虚拟化被占用”的提示。这台机器上如果同时开了其他虚拟机软件的后台服务建议先停掉再继续否则功能开启了但用不上。2.2 WSL2 的安装与内核更新重启完成后先看看系统里有没有已经装好的子系统发行版wsl --list --verbose如果输出里版本号还是 1需要手动切过来wsl --set-default-version 2这一步经常被跳过导致后面 Docker 启动时报“WSL 2 installation is incomplete”。切完默认版本还不够WSL2 需要一个独立的内核组件这个组件不随系统更新自动安装必须单独获取。较新的系统版本支持一条命令搞定wsl --update如果这条命令在你的系统上不识别老一些的版本会这样就手动去下载内核更新包装完再跑wsl --set-default-version 2确认一次。判断是否成功的标准很简单随便起一个发行版然后执行wsl -l -v状态列显示 Running 且版本列显示 2就算通了。这一步的坑在于很多人只装了子系统没更新内核命令能跑、发行版能进但 Docker 就是起不来。我一开始也在这卡过后来养成习惯装完 WSL 就先跑一遍wsl --update再去看版本心里才踏实。2.3 家庭版用户的现实路径家庭版系统没有 Hyper-V但走 WSL2 后端完全没问题因为 WSL2 依赖的是“虚拟机平台”这个功能家庭版是支持的。所以家庭版用户不要在“我的系统没有 Hyper-V 怎么办”上纠结直接按上面的流程开“虚拟机平台”和“Linux 子系统”两项即可。需要额外留意的是系统版本家庭版的 2004 之前版本对 WSL2 支持不完整升级到较新的功能更新之后一切照常。另外家庭版在安装某些组件时可能缺少组策略编辑器这不影响 Docker 安装不用去折腾第三方工具强开组策略没必要。3. 安装 Docker Desktop 与首次配置环境这层通了安装本身反而最快。真正决定你后面用起来顺不顺的是首次启动时的几个配置项数据盘放在哪、给它多少内存、镜像从哪里拉。这三项在默认值下大概率不适合你必须在第一次就调对。3.1 安装包获取与安装选项安装包从官方渠道获取注意选对架构64 位系统就选对应的那个。下载完成后双击运行安装向导里有两个勾选项需要留意。第一个是“使用 WSL2 代替 Hyper-V”如果你前面确定走 WSL2 后端这个要勾上省得装完再去设置里改。第二个是安装完成后是否创建桌面快捷方式、是否把命令行工具加到 PATH这两个按习惯来PATH 那个建议勾上后面在 PowerShell 里直接用docker命令会方便很多。安装过程中会要求注销或重启一次因为要把当前用户加到docker-users用户组里。这一步别嫌麻烦跳过跳过的话你会发现命令行能跑但权限不够还得手动处理。提示安装前建议先把杀毒软件的实时扫描暂时放行安装目录部分安全软件会把 Docker 的虚拟化组件当成可疑行为拦截表现为安装“成功”但启动失败且日志里看不出明显原因。3.2 首次启动的配置向导首次启动会弹出一个服务条款确认页这里有个容易被忽略的点商用场景下的授权条款需要你自己确认清楚个人学习和小团队内部使用通常没问题规模较大的组织要按条款评估。这一步点同意之后进入后端选择页确认勾选 WSL2 后端点应用。如果此时弹出“WSL 内核版本过低”的提示说明 2.2 节那步没做到位回到命令行跑wsl --update然后点界面上的重试按钮不要直接关掉重装。重装解决不了内核版本问题只会浪费半小时。配置向导走完托盘区会出现一个鲸鱼图标图标变绿表示引擎已就绪。但别急着高兴先按第 4 节做验证确认命令行侧也通了才算真的装好。3.3 资源分配与磁盘位置迁移这两项是长期使用体验的分水岭我第一次装的时候全用默认值用了两个月 C 盘告急才发现虚拟硬盘涨到了六十多 G。先说磁盘位置。默认情况下Docker 的虚拟硬盘放在用户目录下也就是 C 盘。进设置页的资源选项卡找到磁盘镜像位置改到空间充裕的非系统盘。改这个位置会触发一次数据迁移已有镜像会一起搬过去耗时取决于数据量所以建议在装完还没拉任何镜像的时候就改几秒钟完事。再说资源分配。WSL2 后端的内存不像 Hyper-V 那样在界面里直接划它走的是一个全局配置文件。在用户目录下新建.wslconfig文件注意前面有个点文件名不能带后缀内容如下[wsl2] memory6GB processors4 swap2GB localhostForwardingtrue参数怎么定我给一个可以直接套的算法宿主内存 16GB 的机器给 6GB32GB 的给 8到10GB8GB 的给 3GB 并且不要同时开太多容器。处理器数量建议不超过物理核心数的三分之二比如八核机器给 4 到 5 个留够余量给宿主系统。交换空间按内存的四分之一到三分之一给作为编译大项目时的缓冲。改完这个文件要执行一次关闭动作才生效wsl --shutdown这条命令我建议你记牢它不是“重启 WSL”这么简单而是彻底释放那个占内存的虚拟进程。你在任务管理器里看到某个虚拟化相关进程吃掉几个 G 内存、关机也不释放的时候跑这一条就回来了。3.4 镜像拉取配置与网络调优默认的镜像仓库在境外拉取大镜像时经常超时。解决办法是配置镜像加速地址在设置页的引擎配置里编辑 JSON{ registry-mirrors: [https://你的加速地址], max-concurrent-downloads: 3, insecure-registries: [] }加速地址需要你自己去找可用的服务提供方各家的地址不同我不在这里列具体的填的时候注意保留https://前缀多个地址用逗号分隔。max-concurrent-downloads这个参数控制并发下载层数默认是 3在网络条件一般的情况下调高反而更容易失败带宽充裕时可以调到 5。改完点应用并重启然后跑docker info输出里能看到镜像地址列表就说明生效了。还有一点经常被忽略如果你所在网络环境走代理需要在设置页的网络选项卡里单独配置而不是靠系统代理自动继承。命令行里的docker pull走的是后台服务进程它读不到你在终端里设置的环境变量这一点跟 Linux 上的习惯完全不同我当初在这上面浪费了不少时间。4. 验证与第一个容器从“能跑”到“好用”装完不等于能用能用不等于好用。这一节的三步验证是有层次的先确认命令行通了再确认容器能起来并访问最后确认数据能持久化、目录能挂载。三步都过日常开发场景基本就覆盖了。4.1 命令行验证清单按顺序跑下面这四条每条都要看输出不能只看有没有报错docker version docker info docker run --rm hello-world docker ps -a第一条看客户端和服务端两段信息是否都完整如果只有客户端一段、服务端那段报连接失败说明引擎没起来去托盘图标看状态。第二条看存储驱动、镜像地址、资源限制是否跟你配置的一致这是排查配置是否生效最快的手段。第三条是拉一个极小的镜像跑一下输出里出现一段成功提示就说明整条链路通了。第四条看已退出的容器列表配合--rm参数跑完的容器会被自动清掉这条命令的输出应该是空列表。注意hello-world这类极简镜像跑通只证明引擎和网络正常不代表你的开发镜像也能跑。真正验证要拿你实际项目用的基础镜像试一次尤其是那些依赖特定架构或者体积上 G 的镜像。4.2 挂载 Windows 目录的三个坑把本地代码目录挂进容器是最常用的操作也是最容易出问题的地方。命令形式是这样的docker run -it --rm -v /c/Users/yourname/project:/app -w /app node:20 bash第一个坑是路径写法。在 Git Bash 里写/c/...在 PowerShell 里写C:\...或者C:/...混用会得到“路径不存在”的报错而实际上目录就在那里。我建议不管用哪个终端都统一用正斜杠的形式兼容性最好。第二个坑是性能。从 Windows 文件系统挂进容器的目录读写速度可能只有容器内部目录的几分之一跑一次依赖安装能差出十几倍。解决办法是把代码放在 WSL2 自己的文件系统里也就是从子系统内部访问的路径下而不是从 Windows 侧挂进去。需要双向编辑的时候用编辑器的远程开发功能直接连子系统里的目录比挂载快得多。第三个坑是权限。Windows 侧挂进去的文件在容器里看到的属主和权限可能跟你预期不符表现为应用写文件失败或者脚本没有执行权限。遇到这种情况不要急着改容器的用户配置先确认文件是不是从 Windows 侧挂进来的把文件挪进 WSL2 的文件系统再看问题常常自己就消失了。4.3 端口映射与本地访问容器里的服务要在宿主上访问需要做端口映射docker run -d --name web-demo -p 8080:80 nginx:alpine-p的格式是“宿主端口:容器端口”顺序别写反。起完访问http://localhost:8080就能看到页面。如果访问不通按这个顺序排查先docker ps确认容器的端口映射列是否正常显示再docker logs web-demo看容器里服务有没有真正起来最后查宿主端口有没有被别的程序占用netstat -ano | findstr :8080有输出就是被占了换一个端口或者按输出末尾的进程号去任务管理器里结束掉。另外提醒一句容器里监听的地址必须是0.0.0.0而不是127.0.0.1后者只有容器内部能访问映射出去也是白搭这个问题在配某些应用时特别常见。4.4 数据卷与持久化容器删掉数据就没了这是新手最容易踩的坑。要保留数据用数据卷docker volume create app-data docker run -d --name db -v app-data:/var/lib/data some-image:latest数据卷由 Docker 管理存在虚拟硬盘里容器删了卷还在只有显式删除卷才会清掉。跟直接挂宿主目录相比数据卷在 Windows 上的读写性能明显更好因为它不经过跨系统文件转换那一层。我的习惯是代码用挂载方便编辑数据一律用卷两不耽误。查看和清理卷也有对应命令docker volume ls列出全部docker volume prune清理没有被任何容器引用的。后者要慎用跑之前先确认没有需要保留的卷这个操作不可逆。5. 常见问题与排查实录这一节是我自己踩过和帮别人处理过的典型问题汇总按出现频率排序。大部分问题的根因都不在 Docker 本身而在系统环境或者配置残留上所以排查思路统一是“先看日志、再看系统状态、最后才怀疑 Docker”。5.1 启动失败速查表现象大概率原因处理动作提示 WSL 2 installation is incomplete内核组件未更新执行wsl --update后重启引擎提示硬件虚拟化未启用固件里的虚拟化开关没开进固件设置开启后重启图标一直是黄色、引擎起不来上次异常退出留下状态执行wsl --shutdown后重启程序提示端口被占用宿主端口冲突用 netstat 查占用进程后换端口拉镜像一直卡住然后超时镜像地址未配置或不可用换加速地址降低并发数磁盘报空间不足虚拟硬盘膨胀清理无用镜像后压缩虚拟硬盘这张表能覆盖八成的情况。剩下两成里最常见的是一类看起来毫无道理的失败所有配置都对昨天还能用今天开机就不行了。这种情况九成是 WSL 的虚拟化服务没起来处理办法是彻底关闭一次再开wsl --shutdown等十秒再启动 Docker通常就恢复了。如果还不行在程序设置里找到重置选项先试“重置为出厂设置”注意这会清掉所有镜像和容器动手前确认没有不可重建的数据。5.2 网络与镜像拉取问题排查拉取失败的报错有好几种含义不同别一股脑都当成网络问题。超时类的报错先确认加速地址是否还可用可以在浏览器里打开那个地址看看能不能正常响应。如果报的是证书相关错误检查地址前缀是不是写成了 http或者系统时间偏差太大导致证书校验失败——这个原因特别隐蔽我遇到过一次折腾了半小时才发现是系统时间慢了两天。另一类报错发生在容器内部访问外部网络时。表现为容器能起但里面的程序连不上任何外部地址。这时候先在容器里跑一条最简单的连通性测试如果端口层面通但域名解析不了就是 DNS 配置的问题在引擎配置里显式指定 DNS 地址即可。Windows 上的网络栈层次多宿主能上网不代表容器能上网这个要先建立心理预期。提示docker info输出里的镜像地址、DNS、存储驱动三项是排查网络和存储问题的第一手信息遇到问题时先看这一段比翻日志快。5.3 磁盘占用暴涨与回收虚拟硬盘只增不减是 WSL2 后端的固有特性用久了 C 盘或者数据盘会明显变小。回收分两步先清 Docker 内部的无用数据再压缩虚拟硬盘文件。第一步清理命令按破坏性从低到高排docker system df docker container prune docker image prune docker builder prune docker system prune -a先跑df看清楚空间被谁占了是镜像、容器、卷还是构建缓存。日常维护用前两条就够构建缓存涨得快的话加上第三条。最后那条会把所有没在运行的容器和没被引用的镜像全清掉属于大扫除级别一个月跑一次就行别天天跑。第二步压缩虚拟硬盘。先关闭所有相关服务wsl --shutdown然后用磁盘管理工具对虚拟硬盘文件做压缩操作。不同系统版本提供的方式不一样有的支持一条命令直接压有的需要走磁盘分区工具的附加功能。做完之后回到设置页看磁盘占用通常会小一大截。这一步建议在清理完内部数据之后做否则压完马上又涨回去。5.4 与其他虚拟化软件的共存问题这台机器上如果还装着别的虚拟机软件共存是可能的但需要版本配合。老版本的虚拟机软件会独占硬件虚拟化能力跟 WSL2 抢资源表现为其中一个能用另一个报错。较新版本已经做了兼容可以同时运行代价是虚拟机性能有一定下降。判断方法很简单关掉所有虚拟机软件看 Docker 是否正常再打开虚拟机软件看 Docker 是否还能正常跑容器。如果打开后 Docker 出问题那就是兼容性冲突去把虚拟机软件升级到较新版本。都升级了还不行的话就只能按使用场景错开——做容器开发时不开虚拟机需要虚拟机时先关掉 Docker 引擎从托盘图标退出即可不用卸载。6. 几个用久了才明白的配置习惯环境搭好只是起点用上一段时间之后有些习惯能让这套东西省心很多都是踩过坑之后慢慢改过来的。第一个习惯是把个人配置写进配置文件而不是靠界面点。.wslconfig管内存和处理器引擎配置里的 JSON 管镜像地址和并发数这两个文件备份一下换机器或者重装之后直接拷过去五分钟恢复原样。靠界面点的话那些选项散落在好几个页面里重装一次要凭记忆复原很容易漏。第二个习惯是给每个项目单独一套编排文件而不是用手敲的长命令。一条docker run带五六个参数的时候隔一天自己都记不住当时为什么这么配。写进编排文件里参数、端口、挂载、依赖关系一目了然也方便提交到代码库里让同事直接用。第三个习惯是定期看一眼docker system df。这个命令的输出比什么都直观镜像占多少、缓存占多少、可回收多少一眼就清楚。我现在的节奏是每周看一次超过阈值就清一轮不等磁盘报警了才动手。磁盘告急的时候再去清往往已经是虚拟硬盘膨胀到需要压缩的程度了多一道工序。第四个习惯是把容器里产生的日志接出来而不是靠docker logs现场翻。日志默认存在容器内部容器一删全没出问题时想回溯都没数据。挂一个卷出去或者配一个日志驱动成本很低真出问题的时候能救命。第五个习惯是记住wsl --shutdown这条命令。它解决的场景比想象中多内存不释放、引擎起不来、网络莫名其妙不通、磁盘占用看着不对先跑这一条再判断能排除掉相当一部分假故障。我现在遇到任何“昨天还好今天不行”的情况第一反应都是先关一次再开十次里有六七次直接就好了。最后说一个很多人忽略但确实影响体验的点中文用户名或者带空格的路径。早期的一些工具链对这类路径处理不完善会出现明明文件存在却读不到的情况。如果你恰好是这类用户名在挂载目录时尽量用英文路径下的子目录或者在 WSL2 内部建工作目录能省掉不少莫名其妙的报错。这个不是 Docker 的问题但在 Windows 环境下确实容易被撞上提前知道能少走弯路。
阅读完成 · 觉得有帮助?
咨询建站