Windows 环境下 Docker + WSL2 完整安装教程
🎯 目标读者:Windows 用户,零 Docker 基础。
⏱️ 预计耗时:30-45 分钟(含下载时间)
✅ 最终效果:Docker Desktop 跑起来,PostgreSQL + Redis 容器正常运行
一、为什么需要 Docker?
你学 Spring Boot + AI,需要一个"底座"来存数据:
| 组件 | 作用 | 传统做法 | Docker 做法 |
|---|---|---|---|
| PostgreSQL | 存向量、用户数据 | 下载 exe,一路 next,配环境变量 | docker run -d postgres,一行搞定 |
| Redis | 缓存、会话 | 同上 | docker run -d redis,一行搞定 |
| MySQL | 业务数据库(日志、订单、知识库) | 下载 exe,配置 my.ini | docker run -d mysql,一行搞定 |
| PGVector | 向量检索 | 需要自己编译安装 | 官方镜像,开箱即用 |
Docker 让你不用在 Windows 上装一堆服务,全部跑在隔离的"小 Linux 虚拟机"里。用完就停,不留垃圾。
二、第一步:启用 WSL2(Windows Subsystem for Linux)
Docker Desktop 在 Windows 上依赖 WSL2 运行。如果你还没有开启:
2.1 管理员身份打开 PowerShell
右键开始菜单 → Windows PowerShell (管理员) 或 终端 (管理员)
2.2 安装 WSL
wsl --install
这条命令会自动做四件事:
- 启用"虚拟机平台"功能
- 启用"Windows Subsystem for Linux"功能
- 安装 WSL2 内核
- 安装 Ubuntu 发行版
安装完成后重启电脑。
2.3 验证 WSL 版本
重启后打开 PowerShell(普通用户即可):
wsl --version
应该看到类似输出:
WSL 版本: 2.7.8.0
内核版本: 6.18.33.1-1
⚠️ 版本号无所谓,关键是要看到 WSL 版本 ≥ 2.0
如果你的 WSL 还是 v1:
wsl --set-default-version 2
2.4 常见问题
Q:公司电脑、域控环境能装吗?
A:大部分可以。如果失败,可能需要 IT 管理员在组策略中启用"虚拟机平台"。
Q:Windows 10 能装吗?
A:Windows 10 版本 2004+(内部版本 19041+)都可以。Win+R → winver 查看版本。
三、第二步:安装 Docker Desktop
3.1 下载
打开官网:https://www.docker.com/products/docker-desktop/
点 Download for Windows,下载 Docker Desktop Installer.exe(约 600MB)。
3.2 安装
双击安装包 → 一路下一步,关键勾选:
✅ Use WSL 2 instead of Hyper-V
如果没看到这个选项——说明 WSL2 没装好,回到第二步。
3.3 启动 Docker Desktop
安装完成后桌面会出现 Docker 图标(蓝色小鲸鱼)。
双击启动,右下角任务栏会出现小鲸鱼图标。首次启动需要 1-2 分钟。
启动完成后鲸鱼图标不再有动画,鼠标悬停显示 “Docker Desktop is running”。
3.4 验证
打开 PowerShell:
docker --version
docker compose version
docker run --rm hello-world
第三条命令如果输出 “Hello from Docker!”,说明 Docker 环境一切正常。
四、第三步:拉取需要的镜像
我们 Day 4 项目需要三个服务:PostgreSQL(带 PGVector 扩展)、Redis 和 MySQL。
4.1 拉取镜像(可选,docker compose 会自动拉)
首次启动会先拉镜像(比较慢,约 2-5 分钟),之后启动只需要几秒。
记得镜像地址要切换为国内的,在设置的docker engine里
{"builder":{"gc":{"defaultKeepStorage":"20GB","enabled":true}},"experimental":false,"features":{"buildkit":true},"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://docker.rainbond.cc","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.nju.edu.cn","https://jocker.hust.edu.cn","https://hubble.kpse.top"]}

docker pull pgvector/pgvector:pg17
docker pull redis:7-alpine
docker pull mysql:8.0
pgvector/pgvector:pg17 是官方维护的 PostgreSQL 17 + PGVector 扩展镜像。
比普通 postgres:17 多了一个向量检索扩展,是 RAG 知识库的核心。
4.2 镜像是什么?
可以理解为"软件的安装包快照"——不是 zip,而是一个完整的小 Linux 文件系统,里面已经装好了 PostgreSQL 和 PGVector 扩展,解压即用。
四、创建 docker-compose 配置文件
新建文件 docker-compose.yml,放哪里都行(建议放项目目录或桌面):
version: "3.9"
services:
# ========== PostgreSQL + PGVector ==========
postgres:
image: pgvector/pgvector:pg17
container_name: ai-postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
POSTGRES_DB: aidb # 自动创建这个数据库
POSTGRES_USER: ai # 数据库用户名
POSTGRES_PASSWORD: password # 数据库密码(学习用,生产请改)
volumes:
- pgdata:/var/lib/postgresql/data # 数据持久化:不丢数据
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ai -d aidb"]
interval: 10s
timeout: 5s
retries: 5
# ========== MySQL ==========
mysql:
image: mysql:8.0
container_name: ai-mysql
restart: unless-stopped
ports:
- "3307:3306" # 映射到 3307 避免和本地 MySQL 冲突
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: ai_logs # 自动创建的业务数据库
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
volumes:
- mysqldata:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot123"]
interval: 10s
timeout: 5s
retries: 5
# ========== Redis ==========
redis:
image: redis:7-alpine
container_name: ai-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redisdata:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 5
volumes:
pgdata:
mysqldata:
redisdata:
逐行解释
| 配置项 | 含义 |
|---|---|
image: pgvector/pgvector:pg17 | 使用哪个镜像(软件包) |
container_name: ai-postgres | 容器名称,方便查看和操作 |
restart: unless-stopped | 除非手动停止,否则自动重启(开机自启) |
ports: "5432:5432" | 把容器的 5432 端口映射到 Windows 的 5432 端口——这样代码连 localhost:5432 就等于连容器 |
volumes: - pgdata:/var/lib/... | 数据卷:把 PG 的数据库文件存在 Docker 管理的独立空间里。删了容器数据还在。 |
healthcheck | 健康检查:每隔 10 秒 ping 一次,确认数据库可用 |
五、启动容器
在 docker-compose.yml 所在目录下:
docker compose up -d
-d 表示后台运行(detached)。
验证
docker ps
应该看到三个容器都在运行,STATUS 列显示 healthy:
CONTAINER ID IMAGE STATUS
36d2ff2b59 pgvector/pgvector:pg17 Up 5 minutes (healthy)
49ea93634c redis:7-alpine Up 5 minutes (healthy)
ad7f3b21e8 mysql:8.0 Up 5 minutes (healthy)
六、常用 Docker 命令速查
| 命令 | 作用 |
|---|---|
docker ps | 查看运行中的容器 |
docker ps -a | 查看所有容器(包括已停止的) |
docker compose up -d | 启动所有服务(后台) |
docker compose down | 停止并删除所有服务 |
docker compose restart | 重启所有服务 |
docker compose logs | 查看日志 |
docker compose logs postgres | 只看 PostgreSQL 日志 |
docker exec -it ai-postgres psql -U ai -d aidb | 进入 PG 命令行 |
docker compose pull | 拉取镜像最新版本 |
Docker Desktop 小鲸鱼图标
| 图标状态 | 含义 |
|---|---|
| 🐋 静止 | 正常运行 |
| 🐋 动画 | 正在启动中 |
| 🐋 红色/黄色 | 出错了 |
| 右键 → Quit | 完全退出 Docker |
七、测试数据库连接
7.1 命令行测试
docker exec -it ai-postgres psql -U ai -d aidb
进入后试试:
-- 查看 PGVector 扩展是否启用
SELECT * FROM pg_extension WHERE extname = 'vector';
-- 看看有哪些表
\dt
-- 退出
\q
7.2 IDEA 连接测试
如果你用 IntelliJ IDEA Ultimate:
- 右侧 → Database → + → Data Source → PostgreSQL
- 填入:
- Host:
localhost - Port:
5432 - Database:
aidb - User:
ai - Password:
password
- Host:
- 点 Test Connection → 看到绿色对勾 → OK
7.3 MySQL 连接测试
命令行测试:
docker exec -it ai-mysql mysql -uroot -proot123 ai_logs
进入后试试:
-- 查看数据库
SHOW DATABASES;
-- 查看字符集
SHOW VARIABLES LIKE 'character%';
-- 预期看到 utf8mb4 — 支持 emoji 和中文
-- 退出
\q
7.4 IDEA 连接 MySQL
- 右侧 → Database → + → Data Source → MySQL
- 填入:
- Host:
localhost - Port:
3307(注意不是默认 3306,我们映射到了 3307) - Database:
ai_logs - User:
root - Password:
root123
- Host:
- 点 Test Connection → 看到绿色对勾 → OK
7.5 代码连接测试
Spring Boot application.yml 连接配置:
PostgreSQL:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/aidb
username: ai
password: password
MySQL(Druid 连接池):
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3307/ai_logs?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root123
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 监控页: http://localhost:8088/druid/
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin123
# 慢 SQL 监控
filter:
stat:
enabled: true
slow-sql-millis: 2000
log-slow-sql: true
⚠️ 端口提示:MySQL 映射到 3307(而非默认 3306),是为了避免与 Windows 本地已安装的 MySQL 冲突。代码里连
localhost:3307即可。
八、常见问题与解决
Q1:Docker Desktop 启动报 “WSL integration” 错误
解决:管理员 PowerShell 执行 wsl --update,然后重启 Docker Desktop。
Q2:容器启动后马上退出
解决:看日志
docker compose logs postgres
常见原因:端口被占用、磁盘空间不足、WSL2 内存不足。
Q3:WSL2 内存吃太多
解决:在 C:\Users\你的用户名\.wslconfig 中限制内存:
[wsl2]
memory=4GB
processors=2
然后 PowerShell 执行 wsl --shutdown,再重启 Docker Desktop。
九、卸载 Docker Desktop(如果需要)
- 设置 → 应用 → 找到 Docker Desktop → 卸载
- 如果想彻底清除所有数据(镜像、容器、卷):
wsl --unregister docker-desktop wsl --unregister docker-desktop-data
十、总结
你现在拥有了:
| 能力 | 说明 |
|---|---|
| ✅ Docker Desktop | 容器运行环境 |
| ✅ WSL2 (Ubuntu) | Docker 的后端 Linux 内核 |
| ✅ PostgreSQL 17 + PGVector | 向量数据库(知识点:RAG 底座) |
| ✅ MySQL 8.0 | 业务数据库(日志、订单、知识库),端口 3307 |
| ✅ Redis 7 | 缓存和会话管理 |
| ✅ 数据持久化 | volumes 保证删容器不丢数据 |
| ✅ 健康检查 | healthcheck 保证服务真的可用才对外暴露 |

1723

被折叠的 条评论
为什么被折叠?



