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