必须显式挂载 /data 目录且宿主机路径需属 uid 999 用户;仅改 redis.conf 的 save 或 appendonly yes 不生效,docker 卷映射才是持久化关键。

Redis Docker 容器如何正确挂载宿主机目录做持久化
直接结论:必须显式挂载 /data 目录,且宿主机路径需有写权限;仅靠 redis.conf 配置不生效,Docker 层面的卷映射才是关键。
为什么改了 save 和 appendonly yes 还不生成 RDB/AOF 文件
常见错误是只修改配置文件却忽略容器内数据目录未与宿主机打通。Redis 默认把 RDB 写到 /data/dump.rdb、AOF 写到 /data/appendonly.aof,而官方镜像默认以 redis 用户运行,该用户对容器内 /data 有权限,但若没挂载,重启后整个 /data 就丢了。
- 检查容器内实际工作目录:
docker exec -it redis-container pwd(通常是/data) - 确认 Redis 是否真在写文件:
docker exec -it redis-container ls -l /data/ - 若看到
dump.rdb但宿主机对应目录为空 → 挂载根本没生效
启动命令中挂载 /data 的三种写法及区别
核心是让容器内 /data 映射到宿主机可持久路径。以下写法均有效,但行为不同:
-
docker run -v /host/redis-data:/data redis:最常用,宿主机路径需提前mkdir -p /host/redis-data && chown -R 999:999 /host/redis-data(999是官方镜像 redis 用户 UID) -
docker run -v redis-data-volume:/data redis:用命名卷,Docker 自动处理权限,适合开发测试,但备份/迁移不如绑定挂载直观 -
docker run --mount type=bind,source=/host/redis-data,target=/data redis:和-v等效,但更明确,支持更多选项如consistency=cached
⚠️ 注意:redis.conf 中的 dir /mycustom/path 不能绕过挂载 —— 即使改了 dir,也得同步挂载那个新路径,否则还是丢数据。
RDB 与 AOF 同时启用时的注意事项
可以共存,但要注意 AOF 重写(bgrewriteaof)会生成临时文件并原子替换原 appendonly.aof,这要求宿主机挂载目录支持 rename 操作(绝大多数本地文件系统都支持,NFS 需确认版本和挂载参数)。
- AOF 开启后,首次启动会尝试加载
appendonly.aof;若该文件损坏,Redis 启动失败,需手动删掉或用redis-check-aof --fix - RDB 快照触发依赖
save配置,例如save 900 1表示 900 秒内至少 1 次修改才保存 —— 低频写入场景下可能长时间无 RDB,别误以为挂载失效 - 混合持久化(
aof-use-rdb-preamble yes)能加快 AOF 加载,但要求 Redis ≥ 4.0,且仍需挂载/data
真正容易被忽略的是权限和 UID 匹配 —— 很多报错如 Can't save in background: Permission denied 或 Failed opening the AOF file: Permission denied,根源都在宿主机目录不属于 UID 999。










