一、这份教程适合谁
这份教程适合下面这种环境:
- Windows 10 / 11
- Docker Desktop
- WSL2 后端
- 需要在本机长期稳定使用 Redis
- 希望 重启 Docker、重启电脑后数据都还在
这份教程重点不是"怎么把 Redis 跑起来",而是:
怎么避免看起来成功、实际上会丢数据的坑。
二、先说最终推荐方案
如果你只是想先拿到一套稳定可用的命令,直接用这一套:
lua
docker volume create redis_data
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
--restart=always \
redis:6.2 \
redis-server \
--appendonly yes \
--appendfsync always \
--requirepass 123456
这套方案的特点:
- 使用 Docker volume 持久化
- Redis 开启 AOF
- 每次写入都尽量立刻刷盘
- 容器跟随 Docker 自动恢复
- 整机重启后也更稳
三、为什么很多"看起来没问题"的 Redis 方案其实会翻车
很多人第一次装 Redis,会这样写:
bash
docker run -d \
--name redis \
-p 6379:6379 \
-v /mnt/d/docker/redis/data:/data \
--restart=always \
redis:6.2 \
redis-server --appendonly yes --requirepass 123456
或者这样写:
bash
docker run -d \
--name redis \
-p 6379:6379 \
-v ~/docker/redis/data:/data \
--restart=always \
redis:6.2 \
redis-server --appendonly yes --requirepass 123456
这两种写法都 可能在某些情况下成功,但都埋着坑。
四、坑 1:把 Redis 数据放到 /mnt/d/... 这类 Windows 磁盘路径
常见写法
bash
-v /mnt/d/docker/redis/data:/data
为什么很多人会这么写
因为这样看起来很方便:
- 数据在 D 盘,看得见
- 容易手动备份
- 容器删了文件还在
真正的问题
在 WSL2 里:
bash
/mnt/d/...
本质上是 WSL 访问 Windows 文件系统。
这类路径对代码、文档、普通文件还可以, 但对 Redis / MySQL 这类数据库并不理想,原因是:
-
IO 性能差
-
fsync 表现不稳定
-
持久化时序容易出问题
-
极端情况下会出现:
set成功- 重启 Docker 还有数据
- 重启电脑后数据没了
现象很迷惑
你会看到:
- Redis 里
set a 1成功 get a也能拿到- 甚至
docker restart redis后数据还在 - 但一旦整机重启,数据丢了
这不是 Redis 命令写错,而是底层存储路径不适合数据库持久化。
结论
不要把 Redis 的运行时数据直接放在
/mnt/d/...这类 Windows 挂载盘上。
五、坑 2:把 Redis 数据放到 ~/docker/... 这种 Ubuntu 家目录
常见写法
bash
-v ~/docker/redis/data:/data
这个方案是不是比 /mnt/d 好
是的,比 /mnt/d 好一些。
因为它在 Ubuntu 发行版自己的 Linux 文件系统里, 读写通常比 /mnt/d 更可靠。
但它也有隐藏坑
Docker Desktop 的引擎并不是跑在你的 Ubuntu 发行版里, 它主要跑在 Docker 自己的 WSL 环境里。
所以当你把 Redis 数据挂载到:
javascript
~/docker/redis/data
实际上可能会出现:
- 重启 Redis 容器,数据还在
- 但整机重启后,容器自动启动时序变化
- 绑定目录没有按你预期就绪
- 最后 Redis 读到的是空数据目录,或者恢复不稳定
结论
~/docker/...可以临时实验,但不建议作为 长期稳定的 Redis 数据目录方案。
六、坑 3:只看到 appendonly.aof 文件,就以为持久化没问题
很多人会这样判断:
目录里已经有
appendonly.aof了,所以持久化肯定正常。
这不一定对。
原因
AOF 文件存在,只能说明:
- Redis 开启了 AOF
- 并且文件被创建了
但不能说明里面已经有你想要的数据。
比如:
bash
ls -lh /mnt/d/docker/redis/data
看到:
appendonly.aof
如果这个文件只有几十字节,可能只是一个空壳,或者只包含极少内容。
正确判断方式
不能只看"有没有文件",要看:
- Redis 当前配置是否真的开启了 AOF
- 当前写入的数据是否在重启后还能恢复
- 当前挂载路径是不是正确
- 当前使用的是不是更稳的 volume 方案
七、坑 4:appendonly yes 不等于"写完就绝对安全"
很多人会以为:
bash
redis-server --appendonly yes
就代表:
只要
set成功,数据一定不会丢
这也是误区。
Redis 是内存数据库
Redis 的本质是:
内存数据库 + 持久化机制
也就是说:
- 你执行
set test 999 - 命令先进入内存
- 再由持久化策略写到磁盘
默认 AOF 同步策略不是最严格的
如果是默认或者类似配置:
appendfsync everysec
含义是:
大致每秒刷盘一次
这就意味着:
- 你刚写完数据
- 很快关机 / 蓝屏 / 断电
- 这一秒内的数据可能还没真正落盘
更稳的方式
如果你更重视安全性,可以改成:
scss
appendfsync always
含义是:
每次写命令都尽量同步刷盘
性能会差一点,但本地开发环境通常完全够用。
结论
appendonly yes很重要,但还不够。 如果你特别在意数据安全,建议搭配appendfsync always。
八、最推荐的稳定方案:Docker volume
为什么推荐 volume
对于 Docker Desktop + WSL2 这套组合, 运行 Redis 这类数据库时,最稳的持久化方式是 Docker volume。
原因:
- 不依赖
/mnt/d - 不依赖 Ubuntu 家目录
- 不受 WSL 发行版启动顺序影响太大
- 由 Docker 自己管理
- 数据会跟着 Docker Desktop 的数据盘走
- 如果你已经把 Docker 数据盘迁移到 D 盘,那么 volume 数据也会跟过去
创建 volume
lua
docker volume create redis_data
用 volume 启动 Redis
lua
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
--restart=always \
redis:6.2 \
redis-server \
--appendonly yes \
--appendfsync always \
--requirepass 123456
九、完整安装步骤(推荐做法)
第 1 步:创建 volume
lua
docker volume create redis_data
第 2 步:启动 Redis
lua
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
--restart=always \
redis:6.2 \
redis-server \
--appendonly yes \
--appendfsync always \
--requirepass 123456
第 3 步:确认容器已启动
docker ps
你应该能看到类似:
erlang
redis redis:6.2 Up ...
第 4 步:进入 Redis
bash
docker exec -it redis redis-cli
第 5 步:输入密码
auth 123456
返回:
OK
第 6 步:写入测试数据
bash
set test 999
get test
如果返回:
arduino
"999"
说明当前写入正常。
十、如何验证这次真的不会丢数据
很多人只做到:
bash
set test 999
get test
这不够。
正确验证要分 3 层
验证 1:重启容器后还在
docker restart redis
再执行:
bash
docker exec -it redis redis-cli
arduino
auth 123456
get test
如果还是:
arduino
"999"
说明容器级持久化正常。
验证 2:重启 Docker Desktop 后还在
重启 Docker Desktop,然后再查一次。
验证 3:重启电脑后还在
这是最关键的验证。
重启电脑后,再执行:
bash
docker exec -it redis redis-cli
arduino
auth 123456
get test
如果还是:
arduino
"999"
这时才能说:
Redis 持久化方案真的稳定了。
十一、如何确认当前挂载方式是不是正确
执行:
docker inspect redis
如果你看到类似这样
json
"Mounts": [
{
"Type": "volume",
"Name": "redis_data",
"Destination": "/data"
}
]
说明你现在是正确方案。
如果你看到的是这种
json
"Type": "bind",
"Source": "/mnt/d/docker/redis/data"
或者:
json
"Type": "bind",
"Source": "/home/你的用户名/docker/redis/data"
说明你用的是 bind mount,不是最稳方案。
十二、Redis 常用管理命令
查看容器
docker ps
查看日志
docker logs redis
停止容器
arduino
docker stop redis
启动容器
sql
docker start redis
重启容器
docker restart redis
删除容器
bash
docker rm -f redis
查看卷
bash
docker volume ls
删除卷(危险,会删数据)
bash
docker volume rm redis_data
十三、如果想备份数据怎么办
推荐做法不是把运行中的数据库直接绑到 D 盘, 而是:
- 运行时用 Docker volume
- 备份时再把数据导出出来
先让 Redis 保存数据
bash
docker exec -it redis redis-cli
auth 123456
save
再拷贝文件出来
例如拷贝 RDB:
bash
docker cp redis:/data/dump.rdb /mnt/d/docker/redis_backup_dump.rdb
这样做的好处:
- 运行稳定
- 备份也方便
- 不会因为直接绑 Windows 目录而影响运行时可靠性
十四、最容易踩坑的总结
坑 1:用 /mnt/d/... 持久化 Redis
- 看起来方便
- 实际对数据库不稳
- 容易出现整机重启后丢数据
坑 2:用 ~/docker/... 持久化 Redis
- 比
/mnt/d好一点 - 但对 Docker Desktop + WSL2 不够稳
- 可能受发行版和启动时序影响
坑 3:只看见 appendonly.aof 文件就放心
- 文件存在不代表里面已经有正确数据
坑 4:只做 set/get 就以为持久化成功
-
真正验证必须包含:
- 重启容器
- 重启 Docker
- 重启电脑
坑 5:以为 appendonly yes 就绝对不会丢
- 还要看
appendfsync - 还要看底层存储是否可靠
十五、最终推荐命令(建议收藏)
lua
docker volume create redis_data
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
--restart=always \
redis:6.2 \
redis-server \
--appendonly yes \
--appendfsync always \
--requirepass 123456
十六、最终建议
如果你是在 Windows + WSL2 + Docker Desktop 里运行 Redis:
推荐
- Docker volume
appendonly yesappendfsync always--restart=always
不推荐
/mnt/d/...直接做 Redis 运行时数据目录~/docker/...作为长期稳定方案- 只做一次
set/get就判断成功
十七、一句话总结
Docker 安装 Redis 不难,难的是避开持久化的坑。 在 Windows + WSL2 + Docker Desktop 环境里, 最稳的方案是:Docker volume + AOF + restart 策略 + 重启验证。