Docker 安装 Redis 教程(重点避坑版)

一、这份教程适合谁

这份教程适合下面这种环境:

  • 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

如果这个文件只有几十字节,可能只是一个空壳,或者只包含极少内容。

正确判断方式

不能只看"有没有文件",要看:

  1. Redis 当前配置是否真的开启了 AOF
  2. 当前写入的数据是否在重启后还能恢复
  3. 当前挂载路径是不是正确
  4. 当前使用的是不是更稳的 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 yes
  • appendfsync always
  • --restart=always

不推荐

  • /mnt/d/... 直接做 Redis 运行时数据目录
  • ~/docker/... 作为长期稳定方案
  • 只做一次 set/get 就判断成功

十七、一句话总结

Docker 安装 Redis 不难,难的是避开持久化的坑。 在 Windows + WSL2 + Docker Desktop 环境里, 最稳的方案是:Docker volume + AOF + restart 策略 + 重启验证。

相关推荐
伞伞悦读2 小时前
Docker 从 C 盘迁移到 D 盘使用教程(Windows + WSL2 + Docker Desktop)
后端
武子康2 小时前
大数据-273 Spark MLib-决策树分类算法详解:ID3、C4.5、CART 与剪枝原理
大数据·后端·spark
听风者就是我2 小时前
Harness Engineering:AI Agent 时代的工程化实践
后端
用户0510122572962 小时前
FFmpeg常用命令行命令
后端
用户962377954482 小时前
原理分析 | Agent —— Tomcat 内存马
后端
Jutick2 小时前
Spring Boot WebSocket 实时行情推送实战:从断线重连到并发优化
后端·架构
Leo8992 小时前
数据结构与算法
后端
Betelgeuse762 小时前
打通 Django 认证:原生 Auth 组件实战与 API 改造
后端·python·django
ltl2 小时前
一致性哈希:不要相信教科书版本
后端