ARTICLE DETAIL

资讯详情

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

Windows 安装 Docker 实战:程序目录与 WSL2 数据目录灵活配置

Windows 安装 Docker 实战:程序目录与 WSL2 数据目录灵活配置 1. 从 C 盘爆红说起为什么要指定目录安装1.1 默认安装的两个隐藏后果我最早在自己的办公笔记本上装 Docker图省事一直用默认选项。装完那阵子确实爽跑 MySQL、Redis、Elasticsearch 都是一条命令的事但半个月后 C 盘就开始报警了。查了一圈才发现Docker 默认状态下根本不是“装了个软件”这么简单——它至少占了两块地方。第一块是程序本身默认落在C:\Program Files\Docker。这一块其实不大也就几个 G真正可怕的是第二块WSL2 后端的数据目录。Docker Desktop 在 Windows 上跑容器靠的是 WSL2 虚拟化技术所有镜像、容器、卷的数据都写在一个虚拟磁盘文件里这个文件默认放在C:\Users\你的用户名\AppData\Local\Docker\wsl下面文件名形如ext4.vhdx。你拉几个大镜像、跑几个带数据卷的数据库这个 vhdx 文件可以轻松涨到二三十个 G而且它不会因为你删了镜像就立刻缩回去。我当时就是因为 Elasticsearch 的镜像和数据分片把 C 盘塞爆差点连系统补丁都打不了。如果你的电脑也把 Docker 装在系统盘上时间一长必会遇到“C 盘空间神秘消失”的问题。所以把这篇文章当作个人笔记写的时候我第一个想记录的就是程序目录和数据目录必须从一开始就分开规划。1.2 程序目录和数据目录要分开想很多第一次装 Docker 的人会问安装目录不是已经在安装向导里选过了吗为什么还要折腾这里有个很常见的误区。“安装目录”指的是 Docker Desktop 软件本身装在哪个文件夹而 WSL2 虚拟磁盘的位置不归安装向导管至少默认情况下它是跟着用户目录走的。我在实际操作中的经验是装 Docker 时至少要关注两个路径路径类型默认位置如果不改会发生什么程序安装目录C:\Program Files\Docker占 C 盘空间但增长有限约 2-4 GWSL2 数据目录C:\Users\用户名\AppData\Local\Docker\wsl镜像、容器层、卷数据都在这最容易涨到几十 G所以如果你手里这台机器 C 盘本身就不宽裕或者你希望把容器数据统一放到某个大盘比如 D 盘、E 盘甚至移动硬盘那就必须把这两个位置都指过去。1.3 这篇笔记的目标我给自己的这条笔记定了三个目标第一把 Docker Desktop 程序装到指定目录比如D:\Docker\Program第二把 WSL2 的虚拟磁盘数据也放到指定目录比如D:\Docker\Data第三装完以后能正常跑 hello-world 和 MySQL 容器并且启动不报错。整个过程用的都是 Windows 自带的东西不需要额外装什么第三方工具。如果你也是 Windows 10/11 用户想看明白“安装路径到底有哪些坑”或者你已经在用 Docker 但被 C 盘空间折磨过这篇笔记应该能帮你省掉不少弯路。2. 动手前先检查确认这台机器能跑 Docker2.1 硬件与系统版本检查Docker Desktop 对 Windows 的版本有硬性要求Windows 10 64 位版本 2004 以上或者 Windows 11。如果你用的是 Windows 7、老版 Windows 10那基本可以直接放弃 Docker Desktop老老实实去折腾老旧的 Docker Toolbox 或者虚拟机方案但那套东西现在已经不推荐了。确认完系统版本第二步是确认 CPU 虚拟化已经开启。操作很简单打开任务管理器切到“性能”标签点击 CPU看右下角有没有“虚拟化已启用”。如果显示“已禁用”就必须进 BIOS 打开 Intel Virtualization TechnologyIntel 平台或者 SVM ModeAMD 平台然后重启电脑。这一步不做后面 Docker Desktop 一启动就会报“Virtualization support not detected”这是非常典型的一个坑。我自己还遇到过一种情况任务管理器显示虚拟化已启用但 Docker Desktop 依然报错。这种多半不是硬件问题而是 Windows 的虚拟机平台功能没开下面的步骤就派上用场了。2.2 启用 Windows 子系统和虚拟化平台以管理员身份打开 PowerShell 或 CMD依次执行下面两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一条启用 WSLWindows Subsystem for Linux第二条启用虚拟机平台。执行完之后系统会提示重启先重启一次。重启后继续以管理员身份打开 PowerShell把默认 WSL 版本设为 2wsl --set-default-version 2如果这里提示“WSL 2 需要更新其内核组件”那说明你还需要安装 WSL2 的 Linux 内核更新包。这个包可以直接从微软官网下载安装教程网上到处都是。装完再执行一次wsl --set-default-version 2直到它没有任何报错地返回。这里我特别记一句很多人以为到这一步还必须在 Microsoft Store 里装一个 Ubuntu其实对 Docker 本身来说不是必须的。Docker Desktop 会自动创建两个隐藏的 WSL 发行版来支撑运行。不过如果你自己也要用 WSL 命令行那顺手装一个 Ubuntu 也不亏。2.3 下载 Docker Desktop 安装包Docker Desktop 安装包可以从 Docker 官网下载搜索“Docker Desktop for Windows”就能找到官方下载入口。这里必须啰嗦一句尽量走官方渠道不要在乱七八糟的第三方网站下安装包那些文件被动手脚的风险很高。下载完你会得到一个名为Docker Desktop Installer.exe的文件体积通常在 500 MB 左右。建议把它放到一个不容易误删的路径比如D:\Downloads因为后面命令行安装也要用到这个文件。另外在开始安装之前先规划好你的目标目录结构。我用的目录规划是D:\Docker\Program # Docker Desktop 程序本体 D:\Docker\Data # WSL2 虚拟机磁盘、容器数据、镜像缓存如果你只想指定一个目录那数值数据目录D:\Docker\Data才是真正的优先级程序目录反而不是重点。3. 核心实操把 Docker 装到指定目录的三种路径3.1 最简单GUI 安装时手动改路径如果安装包版本比较新直接双击Docker Desktop Installer.exe图形安装向导里会有一个界面让你勾选“Use WSL 2 instead of Hyper-V”同时会提供安装位置的选择。勾选 WSL2 后端非常重要这是当前版本 Docker Desktop 的主力运行方式比老的 Hyper-V 方案启动更快、资源占用更低。安装位置就按照你规划好的路径去改比如选到D:\Docker\Program。走 GUI 方式安装的缺点也很明显即使你把程序目录改成了 D 盘WSL2 的虚拟磁盘数据默认仍然会被放到 C 盘用户目录下。要真正做到“数据也落到指定目录”要么用下面这种命令行方式要么装完之后再去改磁盘位置。3.2 一次性到位安装器命令行参数指定目录这是我个人最推荐的安装方式也是这篇笔记里含金量最高的一段。Docker Desktop 的安装器其实支持几个命令行参数可以在安装时直接指定程序目录和数据目录一步到位。以管理员身份打开 PowerShell进入安装包所在目录然后执行.\Docker Desktop Installer.exe install --accept-license --installation-dirD:\Docker\Program --wsl-default-data-rootD:\Docker\Data逐个解释这几个参数参数作用我的取值install触发安装模式固定写法--accept-license自动接受用户许可协议避免交互无--installation-dir指定 Docker Desktop 程序安装目录D:\Docker\Program--wsl-default-data-root指定 WSL2 虚拟磁盘和容器数据根目录D:\Docker\Data执行的时候安装器会走一遍完整的安装流程期间可能弹几次 UAC 确认框点“是”就行。如果你不希望它一闪而过、看不到任何界面可以把命令里的install换掉去掉--accept-license保留后面两个目录参数就能在图形界面里确认一遍路径之后再安装。装完之后在 PowerShell 里跑一下wsl -l -v你会看到 Docker Desktop 创建了两个 WSL 发行版名字通常类似docker-desktop和docker-desktop-data或docker_data。重点看发行版列表里对应的文件位置是否在你设定的目录下。如果wsl-default-data-root这个参数生效了Docker 相关的 vhdx 文件会出现在D:\Docker\Data\docker\或类似路径下。这一步解决了绝大多数人“程序装到 D 盘数据还是悄悄留在 C 盘”的尴尬问题。3.3 补丁方案已经装完把数据迁移到指定目录如果你已经在默认位置装过 Docker Desktop现在 C 盘已经塞了一堆 WSL 虚拟磁盘数据再重新卸载安装虽然可行但没必要这么暴力。迁移数据目录的思路是先把 Docker Desktop 完全停下来再通过 WSL 命令把原来那个数据发行版导出、注销、重新导入到新目录。具体操作如下全程需要管理员权限的 PowerShell# 1. 完全退出 Docker Desktop最好在系统托盘右键 Docker 图标并选择 Quit # 2. 停止所有 WSL 虚拟机 wsl --shutdown # 3. 查看当前 WSL 发行版 wsl -l -v # 4. 把数据发行版导出为 tar 文件名字以 wsl -l -v 列出的为准 wsl --export docker-desktop-data D:\docker-data-backup.tar # 5. 注销旧发行版 wsl --unregister docker-desktop-data # 6. 导入到新目录重新注册发行版 wsl --import docker-desktop-data D:\Docker\Data D:\docker-data-backup.tar --version 2这里有个容易踩坑的细节wsl --unregister会删除该发行版的所有数据所以必须先做导出。另外不同版本的 Docker Desktop 中数据发行版的名字可能不一样务必以wsl -l -v的显示为准不要照着网上的教程死抄名字。导入完成之后启动 Docker Desktop看一下设置里的资源目录是否已经指向新位置。如果启动正常容器数据会继续以新目录为基础读写原 C 盘的那个大 vhdx 文件如果你没有主动删除它还会占着空间确认无误后可以手动删掉以释放磁盘。4. 装完别急着用验货和基础配置4.1 验证 docker 命令和 hello-world安装完成并启动 Docker Desktop 后等在系统托盘里看到 Docker 鲸鱼图标正常显示再打开 PowerShell 验证docker version这条命令会输出客户端和服务端两个版本的详细信息。第二行如果能看到 Server Docker Engine 的版本号说明 Docker 守护进程已经起来了。如果只显示 Client 信息报错说连不上 daemon那多半是启动还没完成或者启动失败了等一会儿再试。接下来拉取并运行官方测试镜像确认引擎能真正干活docker run hello-world正常情况下你会看到一段文字大意是“Hello from Docker!”并解释镜像的拉取过程。这一步如果卡在拉镜像阶段大概率是网络问题下面 4.2 的镜像加速配置就是解决这个的。4.2 配置镜像加速我把这条笔记写在本地一个很现实的问题就是Docker 官方镜像仓库的国际访问速度不稳定拉大镜像时经常超时。解决方案是配置镜像加速器也就是换一个访问更快的公共镜像源。这一步不是必须的但强烈建议做。在 Docker Desktop 里打开“设置”找到“Docker Engine”或“Docker daemon”选项卡看到的是一个 JSON 格式的配置文件。在里面加入registry-mirrors字段{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com ] }改完点右下角的“Apply Restart”。这里我在笔记里特别注明镜像加速地址的有效性和可用性会随时间和网络环境变化网上搜到的最新地址往往更靠谱优先选择你自己云服务商提供的镜像加速地址。配置完成后用docker info看一眼输出的Registry Mirrors列表应该能看到刚才填的地址。有人会问不配镜像加速能不能用能但拉取大镜像比如 MySQL、Elasticsearch、GitLab 这类镜像时到处都是坑。我在实际操作中不配加速器时拉 MySQL 8.0 镜像经常跑到一半就中断配完基本秒拉体验天差地别。4.3 docker compose 的验证现在 Docker Desktop 都会自带docker compose组件不用额外安装。建议顺手验证一下docker compose version能看到类似Docker Compose version v2.x.x的输出就说明没问题。如果你要用 YAML 文件编排多个容器比如同时跑 MySQL 和 Redisdocker compose 是标准姿势。这个组件的重要性不亚于 docker 本身单靠 docker run 一个个敲命令维护起来太痛苦了。4.4 开机自启和日常建议Docker Desktop 默认不会开机自启你可以打开“设置”在“General”选项卡里勾选“Start Docker Desktop when you sign in to Windows”。我个人建议勾选上因为以后你会越来越依赖容器环境每次手动开一次确实很烦。日常使用上还有两个习惯值得记录第一个下载镜像的时候不要用latest标签一把梭生产一点的场景直接指到具体版本比如mysql:8.0不然哪天升级了行为发生变化你的服务和数据可能直接出问题。第二个容器数据卷一定要挂载到宿主机目录方便备份和拷贝比如我后面跑 MySQL 时用docker run -d --name mysql8 ^ -e MYSQL_ROOT_PASSWORDRoot123456 ^ -p 3306:3306 ^ -v D:/Docker/Data/mysql:/var/lib/mysql ^ mysql:8.0这样 MySQL 的数据直接落在D:/Docker/Data/mysql既不占 C 盘空间备份时直接拷贝文件夹就行一举两得。5. 踩坑记录常见报错与排查思路5.1 启动报错“Virtualization support not detected”这是 Windows 上装 Docker 最常见的一个拦路虎我帮朋友排查过好几次。出现这个报错优先级最高的排查顺序是先进 BIOS 确认虚拟化开关是否打开再确认 Windows 的虚拟机平台功能是否启用。有些人 BIOS 里关了 VT-x 自己都不知道检查一遍重启就能解决。如果两项都确认没问题还报错可以试试在“启用或关闭 Windows 功能”里把 Hyper-V 和“虚拟机平台”都勾上。我的经验是Windows 自带虚拟化技术之间的兼容性有时候会闹脾气全开了反而最稳。也有个别情况是笔记本 OEM 出厂时固件锁定虚拟化那就得去 BIOS 里深挖实在找不到还可以查一下笔记本型号是否支持。5.2 Docker Desktop 启动失败或一直转圈启动 Docker Desktop 时一直卡在启动画面或者提示“Docker Desktop failed to start because virtualisation support wasnt detected”类似的字样一般从三个方向排查第一确认wsl -l -v能正常列出发行版如果 WSL 本身挂了Docker 根本起不来第二看看 Windows 的“服务”里LxssManager服务是否正常第三干脆重启一次 Windows很多时候就是虚拟化服务没彻底加载。我遇到过一种很难查的情况Docker Desktop 的安装目录里有残留的异常文件无论怎么重启都起不来最后重装了 Docker Desktop 才解决。如果你已经试遍网上所有方案还不行别心疼那点重装时间重装往往是最干脆的解法。5.3 迁移 WSL2 数据后 docker 命令连不上按照 3.3 的步骤导出、注销、导入之后启动 Docker Desktop 却发现容器跑不起来命令行也连不上 daemon。我还真踩过这个坑原因基本是导入时--import后面指定的目录和 Docker Desktop 期望的目录不一致或者导入时用了错误的发行版名。这时候别慌检查路径和发行版名然后关闭 Docker Desktop重新用wsl --shutdown停掉所有任务再启动 Docker Desktop。如果还不行看看wsl -l -v里的发行版状态是不是Stopped而不是Running。数据迁移这种事耐心比技巧更重要每一步都核对一遍再走下一步。5.4 docker 命令提示不是内部或外部命令如果你用命令行安装 Docker Desktop偶尔会出现装完以后 PowerShell 里找不到 docker 命令的情况。这是因为 Docker 的可执行文件目录没有自动加进 PATH 环境变量或者当前终端没有重新加载环境变量。解决办法有两个要么关掉当前终端重开一个要么手动把D:\Docker\Program\resources\bin加入系统 PATH。这里说明一下D:\Docker\Program装的是 Docker Desktop 本体真正放 docker.exe、docker-compose.exe 之类可执行文件的目录在resources\bin子目录里。如果你是用 3.1 的 GUI 方法安装到默认路径那就是C:\Program Files\Docker\Docker\resources\bin思路是一样的。5.5 其他零碎问题速查现象排查方向容器能启动但访问不到端口确认-p端口映射没写反、Windows 防火墙是否拦截磁盘空间没释放WSL2 的 vhdx 文件不会自动缩水可用diskpart或 WSL 命令压缩也可以重新导出导入一次重启后路由冲突检查 Docker 的网络模式必要时在 WSL 里调整 iptables无法访问容器内的 MySQL确认 MySQL 不是只绑定到容器自身连接时用本机127.0.0.1加映射端口最后再分享一个小技巧给这份笔记做后续维护时我习惯在D:\Docker\Data目录下留一个README.txt里面记录 Docker Desktop 版本、安装日期、镜像加速配置以及常用容器命令。万一以后换电脑或者领导让交接环境翻一眼这个文件就能快速复现整个环境比自己回忆快得多。Windows 上装 Docker 这件事真正的门槛从来不是命令本身而是你愿不愿意把“装到 C 盘默认位置”这个惯性思维改掉。我的建议很简单从第一天就把程序目录和数据目录都规划到非系统盘后面省下来的不是几十个 G 的磁盘空间是大量排查磁盘爆满的时间。
返回列表