Redis容器重启后数据消失主因是Volume挂载错误:未正确挂载/data目录、权限不匹配(需chown 999:999)、redis.conf中dir或dbfilename路径非/data、docker run或docker-compose挂载配置错误。

Redis容器重启后数据消失,是不是没挂对Volume
绝大多数情况是挂载路径没对上,或者挂载方式不匹配Redis的写入行为。Redis默认把RDB快照和AOF日志都写进/data目录,但Docker里如果只用bind mount映射到宿主机一个空目录,或压根没挂载,容器一删,数据就没了。
实操建议:
- 必须用named volume或host path明确挂载到
/data,不能只靠-v redis-data:/data却不检查volume是否存在 - 宿主机路径挂载时,确保目录有写权限:
chown -R 999:999 /path/on/host(Redis官方镜像默认用UID 999运行) - 别在
Dockerfile里用COPY dump.rdb /data/假装持久化——容器启动时Redis会覆盖它
redis.conf里dir和dbfilename配置影响挂载效果
即使挂了/data,如果redis.conf里dir指向别的路径,或者dbfilename设成/tmp/dump.rdb这种非/data下的位置,数据照样不会落到你挂的Volume里。
实操建议:
- 启动前确认conf中
dir值是/data(或你挂载的目标路径),不是.或./ - 检查
save规则是否启用(如save 900 1),禁用所有save会导致RDB根本不会生成 - 若启用了AOF,确认
appendonly yes且appendfilename也在/data下,比如appendfilename "appendonly.aof"
docker run命令里-v参数顺序和冒号分隔容易出错
常见错误是写成-v /data:/var/lib/redis(路径错位)、-v redis-data:/data:ro(只读挂载)、或漏掉/data导致Redis写进容器临时文件系统。
实操建议:
- 标准写法只有两种:
-v redis-data:/data(named volume)或-v /host/path:/data(host path) - 不要加
:z或:ZSELinux标签——除非宿主机真开了SELinux,否则反而可能触发权限拒绝 - 用
docker inspect redis-container查Mounts字段,确认Destination确实是/data,且Mode是rw
用docker-compose.yml时volume声明不等于自动挂载
很多人写了volumes:区块,但没在services.redis.volumes里显式绑定到/data,或者把./redis-data:/data写在了错误的服务下。
实操建议:
-
docker-compose.yml里必须同时存在volumes定义和services.redis.volumes挂载项 - 避免相对路径陷阱:用
./redis-data:/data时,确保docker-compose.yml所在目录下真有redis-data目录,且权限正确 - 首次启动前可手动
mkdir -p ./redis-data && chown -R 999:999 ./redis-data,比依赖容器自动创建更可靠
最常被忽略的是Redis进程UID和宿主机目录权限的错配——哪怕路径、配置、挂载全对,只要/data目录不可写,Redis静默失败,连日志都不报错。










