docker compose实现mysql和redis数据持久化的核心是使用命名卷:mysql需挂载/var/lib/mysql到命名卷(如mysql_data),redis需挂载/data到命名卷(如redis_data)并启用rdb/aof配置,且volumes必须在services内和根级volumes节点中双声明,否则数据随容器销毁而丢失。

Docker Compose 实现数据库与缓存服务的数据持久化,核心是用 命名卷(Named Volumes) 把容器内关键路径的数据“锚定”到宿主机上,避免容器重启或重建时数据丢失。这不是靠备份脚本,而是靠配置本身把存储路径固化下来。
数据库持久化:以 MySQL / MariaDB 为例
数据库的数据目录(如 /var/lib/mysql)必须挂载为命名卷。Docker Compose 不会自动帮你做这件事,不显式声明就等于用临时文件系统——容器一删,全没了。
- 在
docker-compose.yml中为数据库服务定义volumes,并关联一个命名卷名(比如mysql_data) - 确保
volumes块在根层级声明,让 Compose 知道这是要持久管理的存储单元 - 不要用绑定挂载(
./db:/var/lib/mysql)来替代命名卷,尤其在生产环境——权限、路径依赖和跨平台兼容性容易出问题
缓存持久化:Redis 的 RDB/AOF 模式需主动启用
Redis 默认只在内存中运行,关机即失。要让它落盘,得配合配置文件 + 卷挂载双管齐下:
- 挂载一个命名卷(如
redis_data)到/data目录,这是 Redis 默认写入快照(RDB)和日志(AOF)的位置 - 通过
command或挂载自定义redis.conf启用持久化选项,例如:save 900 1(900秒内至少1次修改就保存)、appendonly yes(开启 AOF) - 若仅挂载卷但没开持久化配置,Redis 仍不会写磁盘——卷只是“容器”,内容还得靠 Redis 自己决定要不要存
关键配置结构不能漏
一份可靠的服务编排,volumes 声明必须出现在两个地方:
- 服务内部的
volumes:列表里,指定挂载点(如- mysql_data:/var/lib/mysql) - 文件最底部的
volumes:根节点下,声明该卷名(如mysql_data:),无需额外参数,Docker 会自动创建并管理 - 别把卷名写错或大小写不一致——
redis_data和Redis_data是两个完全不同的卷
验证是否生效的小技巧
启动后别急着写业务数据,先手动验证卷是否真正接管了路径:
- 执行
docker volume ls,确认你定义的卷名已存在 - 用
docker volume inspect查看挂载位置(Host Path),进入该目录看看是否有数据库文件或 Redis 的dump.rdb - 删掉容器再
docker compose up -d重拉一次,检查原有数据是否还在——这才是持久化的最终检验











