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

0 阅读8分钟

一、这份教程适合谁

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

  • Windows 10 / 11
  • Docker Desktop
  • WSL2 后端
  • 需要在本机长期稳定使用 Redis
  • 希望 重启 Docker、重启电脑后数据都还在

这份教程重点不是“怎么把 Redis 跑起来”,而是:

怎么避免看起来成功、实际上会丢数据的坑。


二、先说最终推荐方案

如果你只是想先拿到一套稳定可用的命令,直接用这一套:

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,会这样写:

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

或者这样写:

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 磁盘路径

常见写法

-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

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

正确判断方式

不能只看“有没有文件”,要看:

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

如果返回:

"999"

说明当前写入正常。


十、如何验证这次真的不会丢数据

很多人只做到:

set test 999
get test

这不够。

正确验证要分 3 层

验证 1:重启容器后还在

docker restart redis

再执行:

docker exec -it redis redis-cli
auth 123456
get test

如果还是:

"999"

说明容器级持久化正常。

验证 2:重启 Docker Desktop 后还在

重启 Docker Desktop,然后再查一次。

验证 3:重启电脑后还在

这是最关键的验证。

重启电脑后,再执行:

docker exec -it redis redis-cli
auth 123456
get 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-cli
auth 123456
save

再拷贝文件出来

例如拷贝 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_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 策略 + 重启验证。