Windows下Docker、WSL与Redis安装配置及SpringBoot接入备忘
本文记录 Windows 上安装 Docker Desktop、理解 WSL 2、迁移存储,以及通过 Docker Compose 部署 Redis 并接入 Spring Boot 的操作过程。面向本机开发学习,假设 Spring Boot 在 Windows 的 IDEA 中运行。
整理日期:2026-10-24。界面可能随版本变化。Redis 使用 7.4 系列作为示例,不代表最新版;需严格复现时固定补丁版本或镜像 digest。密码均为占位示例。
一、理解 Docker、WSL 与 Redis
1. WSL 是什么
WSL(Windows Subsystem for Linux)让 Windows 可以运行 Linux 环境。Ubuntu 是其中一种可安装的 Linux 发行版。
- WSL 1 使用系统调用兼容方式。
- WSL 2 使用实际 Linux 内核和轻量虚拟机,适合 Linux 容器。
- WSL 是运行基础,Ubuntu 是具体发行版,两者不是同一个概念。
- WSL 2 的 Linux 文件通常保存于动态增长的 VHDX 虚拟磁盘。
2. Docker 的几个概念
| 名称 | 作用 |
|---|---|
| 镜像 Image | 创建容器的模板,例如 redis:7.4 |
| 容器 Container | 镜像启动后的运行实例 |
| Engine | 管理和运行容器的服务 |
| Docker Desktop | Windows 桌面应用,集成引擎、CLI 和 Compose 等 |
| Compose | 使用 YAML 描述并管理服务 |
| Volume | 独立于容器生命周期保存数据 |
| Bind mount | 将宿主机具体文件或目录映射进容器 |
容器共享 Linux 运行环境的内核,不是每个容器都安装一套完整虚拟机。
3. 它们如何配合
1 | Windows IDEA / Spring Boot |
Docker Desktop 可通过 WSL 2 后端运行 Linux 容器,并不要求额外安装个人 Ubuntu 发行版。安装 Ubuntu 主要用于学习 Linux 或在 WSL 内开发。
使用 Docker Desktop 时,不必再在 Ubuntu 安装独立 Docker Engine;也不需要在 Windows、Ubuntu 和容器中各安装一套 Redis,否则容易出现多个实例与端口冲突。
二、安装与检查 WSL 2
已经安装的电脑先检查,无需重复安装。以下命令均在 Windows PowerShell 执行。
1. 前置条件
- 系统版本满足当前 Docker Desktop 官方安装要求。
- 任务管理器 → 性能 → CPU 中“虚拟化”为已启用。
- 未启用时按电脑厂商说明,到 BIOS/UEFI 开启 Intel VT-x 或 AMD-V。
2. 安装
管理员 PowerShell:
1 | wsl --install |
按提示重启电脑。首次启动 Ubuntu 时创建 Linux 用户名和密码;输入 Linux 密码时不显示字符属于正常现象。
然后检查和更新:
1 | wsl --update |
列表中的 VERSION 为 2,表示该发行版使用 WSL 2。它与 wsl --version 显示的 WSL 软件版本号不是同一个概念。
设置新发行版默认使用 WSL 2:
1 | wsl --set-default-version 2 |
已有发行版仍为 WSL 1 时,先备份,再按实际名称转换:
1 | wsl --set-version Ubuntu 2 |
转换可能耗时并占用额外磁盘空间。
3. 常用命令
1 | # 查看发行版状态 |
退出 Linux 终端使用 exit,不一定停止所有后台进程。执行 wsl --shutdown 会影响 Docker Desktop 的 WSL 后端,先保存工作、停止相关服务。
三、安装 Docker Desktop
1. 下载与设置
从 Docker 官方 Windows 安装页 下载适合处理器架构的安装程序。
- 安装时选择 WSL 2 后端(如安装程序提供该选项)。
- 按提示完成安装,必要时重启或重新登录。
- 打开 Docker Desktop,等待 Engine running。
- 在设置中确认使用 WSL 2 后端和 Linux 容器模式。
- 若需要在 Ubuntu 中运行 Docker 命令,在 Resources → WSL integration 开启 Ubuntu 集成;只用 Windows PowerShell 则不必额外启用个人 Ubuntu 集成。
系统要求和界面入口以官方安装页及实际版本为准。
2. 验证
重新打开普通 PowerShell:
1 | docker version |
docker version 应包含 Client 和 Server。只有 Client 或连接错误,通常表示引擎未启动。
可选测试:
1 | docker run --rm hello-world |
出现 Hello from Docker! 表示镜像拉取与容器运行成功。–rm 在运行结束后删除测试容器,镜像仍保留。
若找不到 docker,先重开终端。本机采用每用户安装,CLI 位于:
1 | C:\Users\wang\AppData\Local\Programs\DockerDesktop\resources\bin\docker.exe |
当前 PowerShell 临时补充 PATH:
1 | $env:Path += ";C:\Users\wang\AppData\Local\Programs\DockerDesktop\resources\bin" |
其他电脑使用实际安装路径;此设置仅对当前终端有效。
四、避免 WSL 和 Docker 占用过多 C 盘
1. 两类数据分别迁移
Ubuntu 与 Docker Desktop 的数据盘独立,只移动 Ubuntu 不会移动 Docker 镜像、命名卷与缓存。
本机已于 2026-10-23 完成以下迁移并验证:
| 对象 | 位置 |
|---|---|
| Ubuntu | D:\WSL\Ubuntu |
| Docker 数据根目录 | D:\DockerData\DockerDesktopWSL |
| Docker 数据盘 | D:\DockerData\DockerDesktopWSL\disk\docker_data.vhdx |
| 迁移备份 | D:\WSL\MigrationBackup-20261023 |
这是本机记录。Docker 内部目录随版本可能不同,其他电脑应按界面和实际文件核对。
2. 迁移普通 WSL 发行版
保存工作、退出 Docker、停止 WSL,先备份重要数据,确认目标固定磁盘空间足够,优先使用 NTFS。
较新 WSL 先用 wsl --help 确认支持 –manage 和 –move:
1 | wsl --shutdown |
发行版名按实际替换,目标目录不要包含其他重要数据。
旧版本可用导出、导入:
1 | wsl --export Ubuntu D:\WSL\Ubuntu-backup.tar |
先验证新实例的文件、用户和服务。导入实例可能默认以 root 启动,需要另设默认用户;支持时可用:
1 | wsl --manage Ubuntu-Migrated --set-default-user 用户名 |
确认后再切换默认发行版。wsl –unregister 会删除对应发行版数据,不要在确认备份和导入成功前注销原实例。 不要手动剪切正在使用的 VHDX。
3. 迁移 Docker 数据
Docker Desktop → Settings → Resources → Advanced → Disk image location。
选择 D 盘目录,Apply & restart,再确认移动。应用可能自动添加 DockerDesktopWSL 子目录。完成后验证新路径、引擎、镜像、容器和卷。
不要随意注销 docker-desktop 或 docker-desktop-data,不同版本存储架构不同,可能丢失数据。
4. 可选的 WSL 资源与 swap 配置
Windows 用户目录的 .wslconfig 是全局 WSL 2 配置,不同于 Linux 内的 /etc/wsl.conf。示例:
1 | [wsl2] |
按电脑资源调整,先创建 D:\WSL,并备份、合并已有配置。退出 Docker 后执行 wsl --shutdown,重新启动生效。
该设置影响所有 WSL 2 发行版,memory 是共享环境资源上限,不是每个容器单独分配的内存。之前的本机迁移没有额外修改 swap,本节只是可选配置。
Linux 内删除文件不保证 Windows 的 VHDX 立即缩小;迁移 Docker 数据盘也不会移动仍绑定在 C 盘的项目目录。
五、用 Compose 安装 Redis
1. 建立项目目录
PowerShell:
1 | New-Item -ItemType Directory -Path D:\DockerProjects\redis-learning -Force |
用编辑器创建两个 UTF-8 文件,注意不要多出 .txt:
1 | redis-learning/ |
2. redis.conf
1 | # 容器内部监听 |
关键理解:
- bind 0.0.0.0 是容器内部监听,Windows 的访问范围在 Compose 中限制。
- requirepass 为默认用户设置密码;进一步权限控制可学习 ACL。
- AOF 记录写操作,everysec 在异常故障时可能丢失最近约一秒的数据;持久化不等于备份。
- maxmemory 是 Redis 数据内存管理限制,整个进程还有额外开销。
- noeviction 达到上限后拒绝需要额外内存的写入,避免自动淘汰学习数据;纯缓存场景可研究 allkeys-lru 等策略。
- Redis 7 的 AOF 可能采用多文件结构,不要假定备份一个 appendonly.aof 就足够。
3. compose.yaml
1 | services: |
| 配置 | 含义 |
|---|---|
| image | Redis 7.4 系列镜像,标签仍可能更新 |
| container_name | 容器名称,便于 exec |
| restart | 引擎启动后恢复,手动停止的除外 |
| 127.0.0.1:6379:6379 | 宿主机本机端口映射到容器端口 |
| redis.conf 挂载 | 使用项目配置,ro 表示只读 |
| redis-data:/data | 命名卷持久保存数据 |
| command | 显式读取自定义配置 |
命名卷通常带项目名前缀,例如 redis-learning_redis-data,实际以 docker volume ls 为准。本机卷数据存于已迁移到 D 盘的 Docker 数据盘,不是直接出现在项目目录里的普通 data 文件夹。
配置只读挂载时,CONFIG REWRITE 无法写回文件。学习时编辑 redis.conf 再重启;CONFIG SET 的临时修改不等于永久保存。
4. 下载与启动
1 | Set-Location D:\DockerProjects\redis-learning |
config 检查 YAML;pull 下载镜像;up 创建/启动服务;-d 表示后台运行。YAML 使用空格缩进,不用 Tab。
预期状态 Up,日志包含 Ready to accept connections。Up 只说明进程运行,仍需验证 Redis 命令。
拉取失败先检查网络、Docker 代理和错误信息,不要随意添加不可信镜像源。
5. 连接与基本读写
PowerShell:
1 | docker exec -it redis-learning redis-cli --askpass |
按提示输入 redis.conf 中的密码。无需在 Windows 安装客户端,且不必把密码放到命令参数中。
进入 Redis 提示符后执行:
1 | PING |
PING 应返回 PONG。EX 60 表示 60 秒过期;TTL 返回剩余秒数,-1 表示未设过期,-2 表示键不存在。
退出:
1 | EXIT |
退出客户端不会停止服务。
6. 验证持久化
先写入不带过期时间的 study:name,退出 CLI,再执行:
1 | docker compose restart redis |
认证后 GET study:name,应该仍能读到值。
还可退出 CLI 后重建:
1 | docker compose down |
再连接并读取。普通 down 删除容器和项目网络,默认保留命名卷。
不要加 -v:docker compose down -v 会删除该项目的数据卷。 改变项目名称或卷名可能使用一个新空卷,不一定是旧数据被删除。
六、Spring Boot 接入
1. 添加 Maven 依赖
在 pom.xml 的 dependencies 内添加,已有则不重复:
1 | <dependency> |
使用 Spring Boot 父 POM 或依赖管理时无需自行指定版本。IDEA 重新加载 Maven。
默认使用 Lettuce,自动配置连接工厂与 StringRedisTemplate,起步无需手写连接池或配置类。
2. application.yml
Spring Boot 3.x/4.x:
1 | spring: |
已有 spring 节点时合并内容,不要创建重复顶层键。Spring Boot 2.x 使用 spring.redis 前缀,先确认版本。
IDEA:Run → Edit Configurations → 当前启动配置 → Environment variables:
1 | REDIS_PASSWORD=你在redis.conf中设置的密码 |
看不到时通过 Modify options 显示。密码不要提交到公共仓库,redis.conf 也应排除提交,公开时提供不含真实密码的示例文件。
若设置 spring.data.redis.url,独立的 host、port、username、password 会被忽略,不要随意混配。
3. 实际读写测试
确保有测试依赖:
1 | <dependency> |
在 src/test/java 下创建类,替换包名,并放到启动类同包或子包:
1 | package com.example.demo; |
测试运行配置也需设置 REDIS_PASSWORD,未必继承主程序运行配置。
通过后在 Redis CLI 执行:
1 | GET study:springboot:connection |
应读到 hello redis,以及不超过 300 秒的剩余有效期。仅 Spring Boot 启动成功不能证明 Redis 可用,实际读写才验证完整链路。
先用 StringRedisTemplate 学习字符串,对象可先显式转 JSON;以后再学习统一序列化和缓存注解。
4. 地址随运行位置变化
| 应用位置 | Redis 地址 |
|---|---|
| Windows IDEA | 127.0.0.1:6379 |
| 与 Redis 同一 Compose 网络的应用容器 | redis:6379,redis 为服务名 |
| Ubuntu WSL 内 | 取决于 NAT/镜像网络和端口监听,需单独检查 |
容器内 localhost 指向容器自己,不是 Windows 或另一容器。WSL NAT 下访问仅绑定 Windows 回环地址的服务存在限制;先用 Windows IDEA 完成学习,或让应用与 Redis 进入同一 Compose 网络。
七、Redis 命令练习
以下在 Redis CLI 中执行:
1 | # 字符串与计数 |
SCAN 返回下一次游标和本批结果,继续使用返回游标,直到游标为 0。COUNT 是工作量提示,不保证每批精确数量。大数据实例避免使用 KEYS *。
逻辑数据库索引不是独立服务器,也不是权限隔离。先统一使用数据库 0。
八、日常操作与排错
1. 命令速查
Compose 命令在 D:\DockerProjects\redis-learning 目录执行。
| 目的 | 命令 |
|---|---|
| 启动/应用 Compose 修改 | docker compose up -d |
| 状态 | docker compose ps |
| 最近日志 | docker compose logs –tail 50 redis |
| 实时日志 | docker compose logs -f redis |
| 停止,保留容器 | docker compose stop |
| 启动已停止的容器 | docker compose start |
| 重启并读取 redis.conf | docker compose restart redis |
| 删除容器和网络,保留卷 | docker compose down |
| 数据卷列表 | docker volume ls |
| 资源用量 | docker stats redis-learning |
查看实际挂载:
1 | docker inspect redis-learning --format '{{json .Mounts}}' |
Ctrl+C 退出日志/资源查看不会停止后台容器。restart 不会应用 Compose 中改过的端口和挂载,改这些需要 up -d。
重启电脑后先启动 Docker Desktop;restart 策略不会替你启动桌面应用。
2. 备份思路
数据卷保留不等于备份:
- 保留 Compose 与配置记录,密码按私有资料管理。
- 学习环境可以停止 Redis 后对完整数据卷做离线归档,避免边写边复制。
- 恢复到独立测试卷验证后,才算备份可用。
- 备份整个 Docker Desktop 数据盘时,按官方指南完全退出 Docker,再复制 VHDX。
- 升级前备份并检查兼容性,不要直接用旧版打开新版改写的数据。
3. 故障排查
| 现象 | 检查 |
|---|---|
| docker 找不到 | 重开终端、检查 PATH 与安装位置 |
| 连接 Docker Server 失败 | Desktop 引擎、context |
| 拉取超时 | 网络、代理、错误信息 |
| 6379 被占用 | 改为 127.0.0.1:6380:6379,Spring Boot 改 6380 |
| 容器反复重启 | 查看日志,检查配置和挂载 |
| redis.conf 挂载失败 | 是否为文件、是否多出 .txt、是否在正确目录 |
| NOAUTH | 未认证,使用 –askpass |
| WRONGPASS | 密码不一致,改文件后需重启 |
| 找不到 REDIS_PASSWORD | 在实际运行的主程序/测试配置中设置 |
| Connection refused | 容器状态、host、映射端口 |
| OOM command not allowed | 达到 maxmemory,检查数据、TTL 与策略 |
| 重建后数据为空 | 卷名、项目名、数据库索引,是否误删卷 |
| 测试找不到启动配置 | 测试类包位置,必要时显式指定启动类 |
检查 Windows 端口:
1 | Get-NetTCPConnection -LocalPort 6379 -ErrorAction SilentlyContinue |
宿主机改用 6380 时,容器内 Redis CLI 仍使用容器端口 6379。
4. 注意事项
本文仅发布本机回环端口。不要为连接方便直接向公网开放 Redis 或关闭保护模式;远程使用需另行配置网络访问、ACL 和必要的加密。
不确认数据价值时,不要运行 FLUSHALL、FLUSHDB、docker compose down -v 或 docker system prune –volumes。
九、学习验收
- 理解镜像、容器、命名卷和绑定挂载。
- 能用 wsl -l -v 查看状态。
- docker version 包含 Server。
- Redis PING 返回 PONG。
- 完成 SET、GET、EXPIRE、TTL。
- 重启、重建容器后数据仍在。
- Spring Boot 实际读写测试通过。
- 理解 Windows、WSL、容器中的 localhost。
- 知道数据与备份位置,知道哪些命令删除数据。
建议后续学习:JSON 序列化 → 缓存注解 → 缓存穿透/击穿/雪崩 → 分布式锁和原子操作 → ACL、监控、备份恢复。

