Docker安装踩坑与心得

本文基于 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
2
3
Start-Process -FilePath 'D:\Docker\Docker Desktop Installer.exe' -Wait `
-ArgumentList 'install','--user','--accept-license','--backend=wsl-2',
'--installation-dir=D:\Docker\Program','--wsl-default-data-root=D:\Docker\WSL'

结果直接报错:

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
2
3
Start-Process -FilePath 'D:\Docker\Docker Desktop Installer.exe' -Wait -Verb RunAs `
-ArgumentList 'install','--accept-license','--backend=wsl-2',
'--installation-dir=D:\Docker\Program','--wsl-default-data-root=D:\Docker\WSL'

参数说明:

参数 含义
-Wait 等待安装进程结束再返回
-Verb RunAs 以提权方式启动(弹 UAC)
--installation-dir 程序本体安装路径
--wsl-default-data-root WSL2 虚拟磁盘位置 = 容器数据的真正落点
--backend=wsl-2 显式指定 WSL2 后端

安装完成后重启电脑。

2.3 安装后验证

1
2
3
Test-Path 'D:\Docker\Program\Docker Desktop.exe'      # 应为 True
Test-Path 'C:\Program Files\Docker\Docker' # 应为 False
Get-ChildItem 'D:\Docker\WSL' -Recurse -Filter *.vhdx

实测生成的虚拟磁盘:

1
2
D:\Docker\WSL\disk\docker_data.vhdx   ← 容器/镜像/卷数据(关键)
D:\Docker\WSL\main\ext4.vhdx ← docker-desktop 发行版系统盘

目录结构要点(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
2
3
4
# WSL2 resource limits for Docker Desktop
[wsl2]
memory=4GB
swap=2GB

文件必须是 ASCII/UTF-8 编码,中文注释若编码不对可能导致解析问题(本人实测中文注释变乱码,改用英文注释解决)。

生效方式:

1
2
wsl --shutdown          # 必须彻底关掉 WSL 才会重新读取配置
# 然后重新启动 Docker Desktop

验证:

1
2
docker run --rm redis:alpine sh -c 'free -m | head -2'
# 实测 total ≈ 3917 MB ≈ 4 GB,说明限制生效

四、内存到底回没回来

这是很多人关心的问题,三种关闭方式对比:

右键任务栏鲸鱼图标 → Quit

UI 和引擎退出,但 WSL 虚拟机通常仍驻留,占用几百 MB~数 GB

命令行停引擎,与 Quit 基本等价,虚拟机大概率还在

唯一保证 100% 内存归还 Windows 的方式

关键事实:WSL2 有动态内存回收——虚拟机空闲页面会及时还给 Windows,所以”驻留”≠”死占”。但回收不是 100% 及时,要彻底归还只有 wsl --shutdown。

推荐关闭顺序:

1
2
3
docker stop <容器名>        # 可选:让数据库先刷盘
docker desktop stop # 或右键任务栏鲸鱼 → Quit
wsl --shutdown # 想把内存彻底还给系统时执行

为什么空闲也可能超过 1 GB

Windows 上的 Docker Desktop = 两套东西:

  1. Windows 侧:UI(Electron)、后端服务
  2. 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
2
3
4
5
wsl --shutdown
diskpart # 管理员运行
select vdisk file="D:\Docker\WSL\disk\docker_data.vhdx"
compact vdisk
exit

压缩前建议先 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 正确做法:官方设置界面

  1. 打开 Docker Desktop → 齿轮(Settings)→ 左侧 “Docker Engine”
  2. 右侧 JSON 编辑器全选替换为:
1
2
3
4
5
6
7
8
9
10
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
  1. 点右下角 **”Apply & restart”**,等引擎重启完成

验证:

1
2
3
docker info | findstr -i "Mirror"
# 应输出: Registry Mirrors: https://docker.m.daocloud.io/
docker pull alpine:latest # 无前缀直接拉,成功即生效

Docker Desktop 每次大版本更新后设置可能被重置,更新后记得检查。镜像站属第三方中转,若某天失效,换一个镜像站地址重复上述步骤即可。

七、部署 Redis + PostgreSQL

7.1 踩坑③:端口冲突

本机已有 PostgreSQL 18 占用 5432,先检测再动手:

1
2
netstat -ano | findstr ":5432"    # 本机 PG18 正在监听 → 容器必须换端口
netstat -ano | findstr ":6379" # 空闲 → Redis 可用默认

决策:容器版 PostgreSQL 宿主机端口改为 5433,6379 不变。

7.2 Compose 编排文件

文件:D:\Docker\compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Redis + PostgreSQL(pgvector) 编排
services:
redis:
image: redis:alpine
container_name: redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes # AOF 持久化
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 5

postgres:
image: pgvector/pgvector:pg17
container_name: postgres
ports:
- "5433:5432" # 宿主机 5433 -> 容器 5432 (5432 被本机 PG18 占用)
environment:
POSTGRES_PASSWORD: "123456"
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 3s
retries: 5

volumes:
pgdata:
redis-data

要点:

  • pgvector/pgvector:pg17 镜像自带 pgvector 扩展,无需另行编译
  • named volume 保证数据落在 D 盘 vhdx 里
  • **restart: unless-stopped**:重启 Docker Desktop 后容器自动恢复
  • healthcheck:让 docker compose ps 显示 (healthy),方便判断服务真就绪

7.3 启动与验证

1
2
3
4
5
6
7
8
9
10
11
12
Set-Location D:\Docker
docker compose up -d
docker compose ps # 等两个容器变成 (healthy)

# Redis 读写测试
docker exec redis redis-cli set greeting hello # OK
docker exec redis redis-cli get greeting # hello

# pgvector 验证
docker exec postgres psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS vector;"
docker exec postgres psql -U postgres -c "SELECT extversion FROM pg_extension WHERE extname='vector';"
# vector | 0.8.7
服务 地址 认证
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
2
curl -L -x http://127.0.0.1:7890 -o app-Windows-x86.zip \
"https://github.com/asxez/DockerDesktop-CN/releases/download/4.94.0/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 正确的汉化步骤

  1. 彻底退出 Docker Desktop(右键鲸鱼 Quit,任务管理器确认无相关进程)
  2. 备份原始文件(管理员权限操作):
1
2
3
frontend\Docker Desktop.exe   → .bak
frontend\resources\app.asar → .bak
frontend\resources\app.asar.unpacked → .bak
  1. 替换(从汉化包解压):
1
2
3
汉化包 Docker Desktop.exe   → frontend\Docker Desktop.exe   ← 注意是 frontend!
汉化包 app.asar → frontend\resources\app.asar
汉化包 app.asar.unpacked\ → frontend\resources\app.asar.unpacked\

根目录启动器不动(保持官方原版)。

  1. 启动 Docker Desktop,验证引擎正常 + 界面变中文
  2. 建议在 Settings → General 把更新检查改为手动,避免自动更新覆盖汉化
一键还原为原版
1
2
3
4
5
$p = 'D:\Docker\Program'
Copy-Item "$p\frontend\Docker Desktop.exe.bak" "$p\frontend\Docker Desktop.exe" -Force
Copy-Item "$p\frontend\resources\app.asar.bak" "$p\frontend\resources\app.asar" -Force
Copy-Item "$p\frontend\resources\app.asar.unpacked.bak" "$p\frontend\resources\app.asar.unpacked" -Recurse -Force
# 重启 Docker Desktop 即恢复英文原版

九、最终检查清单

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% 的坑都来自”你不知道数据和程序到底在哪”**。

几个关键认知:

  1. --wsl-default-data-root 比 --installation-dir 重要——前者决定容器数据落点,后者只是程序本体
  2. --user 免管理员安装看着香,但虚拟机平台没启用就白搭——要么提前手动启用,要么直接管理员装
  3. 改配置优先走官方设置界面,直接改 json 配置文件很可能不生效
  4. 汉化前先搞清楚哪是启动器、哪是主程序,否则 ICU 报错能让你怀疑人生
  5. 内存归还只有 wsl --shutdown 是真彻底,其他都是表面功夫

希望这篇踩坑记录能帮到同样在 Windows 上折腾 Docker 的你。


官方参考文档