Docker安装踩坑与心得

Docker安装踩坑与心得
Silence本文基于 2026-10-14 在一台 Windows 11 Home China 上的完整实操记录,包含全部真实踩坑过程与解决方案。适用于:程序装 D 盘、内存受限、国内网络环境、跑 Redis / PostgreSQL 的个人开发场景。
一、环境背景
先交代一下我的机器情况,方便大家对号入座:
| 项目 | 值 |
|---|---|
| 系统 | Windows 11 Home China,版本 26200 |
| 内存 | 16 GB |
| C 盘 | 约 31 GB 可用(紧张,所以一切装 D 盘) |
| D 盘 | 约 49 GB 可用 |
| WSL | 3.0.1 已预装 |
| 已有软件 | PostgreSQL 18(占用 5432 端口) |
| 网络 | 国内直连 Docker Hub 不通,有 Clash 代理 |
最终成果:
| 项目 | 结果 |
|---|---|
| 程序本体 | D:\Docker\Program |
| WSL2 数据盘 | D:\Docker\WSL(容器/镜像/卷全在这) |
| 虚拟机内存上限 | 4 GB(.wslconfig) |
| Redis | localhost:6379,AOF 持久化 |
| PostgreSQL 17 + pgvector | localhost:5433(5432 让给本机 PG18) |
| 镜像源 | https://docker.m.daocloud.io |
| 界面汉化 | DockerDesktop-CN 4.94.0 包 |
二、安装阶段的坑
2.1 踩坑①:每用户模式安装失败
我最初的计划是用 --user 参数做免管理员安装,命令是这样的:
1 | Start-Process -FilePath 'D:\Docker\Docker Desktop Installer.exe' -Wait ` |
结果直接报错:
Installation failed. One prerequisite is not fulfilled. Docker Desktop requires the “Virtual Machine Platform” Windows feature, which is not enabled on this machine. A per-user installation cannot enable it, because that requires administrator privileges.
原因:WSL 程序装了 ≠ 底层的”虚拟机平台”Windows 功能已启用,而每用户模式没有权限启用 Windows 功能。
解决方案(二选一):
- 方案A(本文采用):改用所有用户模式安装(去掉
--user),安装器自动启用该功能 - 方案B:先手动在管理员 PowerShell 执行
wsl --install --no-distribution,重启后再用每用户模式
两种方案都必须重启一次,虚拟机平台是内核级功能。
2.2 实际执行的安装命令
以管理员身份打开 PowerShell,执行:
1 | Start-Process -FilePath 'D:\Docker\Docker Desktop Installer.exe' -Wait -Verb RunAs ` |
参数说明:
| 参数 | 含义 |
|---|---|
-Wait |
等待安装进程结束再返回 |
-Verb RunAs |
以提权方式启动(弹 UAC) |
--installation-dir |
程序本体安装路径 |
--wsl-default-data-root |
WSL2 虚拟磁盘位置 = 容器数据的真正落点 |
--backend=wsl-2 |
显式指定 WSL2 后端 |
安装完成后重启电脑。
2.3 安装后验证
1 | Test-Path 'D:\Docker\Program\Docker Desktop.exe' # 应为 True |
实测生成的虚拟磁盘:
1 | D:\Docker\WSL\disk\docker_data.vhdx ← 容器/镜像/卷数据(关键) |
目录结构要点(4.95 实测,与网上旧教程不同):根目录的 Docker Desktop.exe 只是 15.7 MB 官方启动器(stub),真正的 Electron 界面主程序(225 MB)在 frontend\ 子目录里。这个结论后面汉化时会救你一命。
三、内存限制配置
16 GB 内存的机器,给 Docker 虚拟机限 4 GB,跑 Redis/Postgres 绰绰有余。
配置文件位置:C:\Users\<你的用户名>\.wslconfig(用户主目录下,不在 Docker 目录里),文件不存在就新建:
1 | # WSL2 resource limits for Docker Desktop |
文件必须是 ASCII/UTF-8 编码,中文注释若编码不对可能导致解析问题(本人实测中文注释变乱码,改用英文注释解决)。
生效方式:
1 | wsl --shutdown # 必须彻底关掉 WSL 才会重新读取配置 |
验证:
1 | docker run --rm redis:alpine sh -c 'free -m | head -2' |
四、内存到底回没回来
这是很多人关心的问题,三种关闭方式对比:
右键任务栏鲸鱼图标 → Quit
UI 和引擎退出,但 WSL 虚拟机通常仍驻留,占用几百 MB~数 GB
命令行停引擎,与 Quit 基本等价,虚拟机大概率还在
唯一保证 100% 内存归还 Windows 的方式
关键事实:WSL2 有动态内存回收——虚拟机空闲页面会及时还给 Windows,所以”驻留”≠”死占”。但回收不是 100% 及时,要彻底归还只有 wsl --shutdown。
推荐关闭顺序:
1 | docker stop <容器名> # 可选:让数据库先刷盘 |
为什么空闲也可能超过 1 GB
Windows 上的 Docker Desktop = 两套东西:
- Windows 侧:UI(Electron)、后端服务
- WSL2 侧:一台 Linux 虚拟机,里面跑 dockerd
虚拟机一旦启动就有基础开销,哪怕零容器。两边加起来,空闲 1~2 GB 属正常现象。
Settings → Resources 里的 Resource Saver 模式不承诺降低 WSL2 虚拟机的内存占用,它不是内存开关。限内存的正确姿势是 .wslconfig。
五、数据存放与迁移
用 --wsl-default-data-root=D:\Docker\WSL 安装后:
- 镜像、容器层、named volume(Redis/Postgres 数据) 全部存放在
D:\Docker\WSL\disk\docker_data.vhdx内 → 确实在 D 盘
唯一例外:如果用 -v C:\some\path:/data 这种 bind mount 挂 C 盘路径,数据才真的写到 C 盘。所以数据库持久化请始终用 named volume。
vhdx 只增不减怎么办
删除容器/镜像后,docker_data.vhdx 不会自动缩小。未来 D 盘臃肿时,用 diskpart 压缩:
1 | wsl --shutdown |
压缩前建议先 docker system prune -a 清掉不用的镜像,效果更好。
六、镜像源配置的坑
6.1 为什么需要
国内直连 registry-1.docker.io 会遇到 DNS 污染(实测解析到 Facebook IP 段),拉镜像必然超时失败:
1 | dial tcp 157.240.x.x:443: connectex: 连接尝试超时 |
6.2 踩坑②:直接改 settings-store.json 不生效
错误尝试:停止 Docker Desktop → 往 %APPDATA%\Docker\settings-store.json 里加 engineConfig 键 → 重启。
结果:键被保留但 docker info 里没有出现 Registry Mirrors 段,说明 Docker Desktop 4.95 没有采纳这种写法。
6.3 正确做法:官方设置界面
- 打开 Docker Desktop → 齿轮(Settings)→ 左侧 “Docker Engine”
- 右侧 JSON 编辑器全选替换为:
1 | { |
- 点右下角 **”Apply & restart”**,等引擎重启完成
验证:
1 | docker info | findstr -i "Mirror" |
Docker Desktop 每次大版本更新后设置可能被重置,更新后记得检查。镜像站属第三方中转,若某天失效,换一个镜像站地址重复上述步骤即可。
七、部署 Redis + PostgreSQL
7.1 踩坑③:端口冲突
本机已有 PostgreSQL 18 占用 5432,先检测再动手:
1 | netstat -ano | findstr ":5432" # 本机 PG18 正在监听 → 容器必须换端口 |
决策:容器版 PostgreSQL 宿主机端口改为 5433,6379 不变。
7.2 Compose 编排文件
文件:D:\Docker\compose.yaml
1 | # Redis + PostgreSQL(pgvector) 编排 |
要点:
pgvector/pgvector:pg17镜像自带 pgvector 扩展,无需另行编译- named volume 保证数据落在 D 盘 vhdx 里
- **
restart: unless-stopped**:重启 Docker Desktop 后容器自动恢复 - healthcheck:让
docker compose ps显示(healthy),方便判断服务真就绪
7.3 启动与验证
1 | Set-Location D:\Docker |
| 服务 | 地址 | 认证 |
|---|---|---|
| PostgreSQL 17 | localhost:5433 |
user=postgres,password=123456 |
| Redis | localhost:6379 |
无密码(仅本机开发用) |
八、界面汉化(三个坑)
方案来源:DockerDesktop-CN 开源项目。原理:替换界面资源文件 app.asar 和配套的界面主程序 exe。只动界面,不碰引擎、容器、镜像、数据卷——数据完全安全。
8.1 踩坑④:版本不匹配
本机 Docker Desktop 4.95.0,汉化包最新版 4.94.0(该项目约每周发一版)。先打 4.94 包,等 4.95 包出来后按同样步骤换上。
4.74.0+ 光换 app.asar 不换 exe 是不行的,exe 也必须一起替换(完整性校验)。
8.2 踩坑⑤:国内直连 GitHub 下载失败
curl 直接下载 release 资产:exit 56(连接中断)/ exit 28(超时),0 字节。
解决:借道 Clash 代理下载(默认端口 7890):
1 | curl -L -x http://127.0.0.1:7890 -o app-Windows-x86.zip \ |
下载后核对文件大小是否与 GitHub 页面显示一致(本次 116,792,710 字节,完全吻合)。
8.3 踩坑⑥:exe 放错位置 ★最关键的坑
错误做法:把汉化包里的 Docker Desktop.exe(225 MB)替换到根目录 D:\Docker\Program\Docker Desktop.exe。
症状:启动后进程立即退出,报错:
1 | [ERROR:base\i18n\icu_util.cc:232] Invalid file descriptor to ICU data received. |
原因:根目录的 exe 只是 15.7 MB 启动器,真正的 225 MB 主程序在 frontend\ 里,Chromium 支持文件(icudtl.dat 等)也都在 frontend\ 下。放到根目录就找不到旁边的 icudtl.dat,于是 ICU 崩溃。
8.4 正确的汉化步骤
- 彻底退出 Docker Desktop(右键鲸鱼 Quit,任务管理器确认无相关进程)
- 备份原始文件(管理员权限操作):
1 | frontend\Docker Desktop.exe → .bak |
- 替换(从汉化包解压):
1 | 汉化包 Docker Desktop.exe → frontend\Docker Desktop.exe ← 注意是 frontend! |
根目录启动器不动(保持官方原版)。
- 启动 Docker Desktop,验证引擎正常 + 界面变中文
- 建议在 Settings → General 把更新检查改为手动,避免自动更新覆盖汉化
一键还原为原版
1 | $p = 'D:\Docker\Program' |
九、最终检查清单
Test-Path D:DockerProgramDocker Desktop.exe → True
C 盘没有被装 Docker
D:\Docker\WSL\ 下存在 disk\docker_data.vhdx
.wslconfig 存在且含 memory=4GB
docker info 的 Total Memory ≈ 3.8 GiB
docker compose ps:redis、postgres 均 (healthy)
Registry Mirrors: https://docker.m.daocloud.io/
Docker Desktop 界面显示中文
三个 .bak 备份文件齐全
十、心得总结
这次安装最大的体会是:**Windows 上玩 Docker,90% 的坑都来自”你不知道数据和程序到底在哪”**。
几个关键认知:
--wsl-default-data-root比--installation-dir重要——前者决定容器数据落点,后者只是程序本体--user免管理员安装看着香,但虚拟机平台没启用就白搭——要么提前手动启用,要么直接管理员装- 改配置优先走官方设置界面,直接改 json 配置文件很可能不生效
- 汉化前先搞清楚哪是启动器、哪是主程序,否则 ICU 报错能让你怀疑人生
- 内存归还只有
wsl --shutdown是真彻底,其他都是表面功夫
希望这篇踩坑记录能帮到同样在 Windows 上折腾 Docker 的你。






