核心要点在于利用命名卷挂载数据库/Redis的关键目录:MySQL挂载/var/lib/mysql,Redis挂载/data,明确地定义volumes块并进行引用,以避免绑定挂载。而Memcached无需数据持久化,因为它被设计为纯内存缓存。

要通过Docker Compose达成数据库与缓存服务的持久化,关键在于对volumes进行正确配置,即将容器内的关键数据目录挂载到Docker所管理的命名卷(named volume)上。如此一来,哪怕容器经历重启、重建甚至被删除,数据依然会保留在卷中,不会出现丢失的情况。
数据库服务(如 MySQL、PostgreSQL)持久化要点
数据库的数据目录必须映射到持久化卷,否则每次容器重建都会清空所有表和数据。
- 以 MySQL 为例,最新镜像默认将数据存放在
/var/lib/mysql,需通过volumes将其绑定到命名卷 - 不要用主机路径(bind mount)做生产环境持久化,推荐使用 Docker 管理的命名卷,更安全、可移植、免权限问题
- 确保
environment中设置了必要的初始化参数(如MYSQL_ROOT_PASSWORD),避免因卷存在但未初始化导致启动失败
Redis 持久化配置关键项
Redis 默认仅内存运行,要持久化必须启用 RDB 或 AOF,并确保数据目录可写且被卷保护。
- 在
docker-compose.yml中为 Redis 配置volumes,挂载/data目录(Redis 默认工作目录) - 通过
environment设置REDIS_MAXMEMORY和REDIS_MAXMEMORY_POLICY,防止内存溢出影响稳定性 - 若需更强保障,可在 Redis 镜像启动时加载自定义
redis.conf,开启sa ve规则或appendonly yes
Memcached 本身不支持持久化,但仍有数据保护方式
Memcached 是纯内存缓存,设计上不落盘。它的“持久化”仅指进程重启后缓存内容不恢复——但这不影响业务,因为缓存本就该容忍丢失。
- 无需配置 volumes 存储缓存数据,强行挂载无意义
- 可挂载日志或配置文件(如通过
command指定-v /path/conf:/etc/memcached.conf),用于管理行为 - 若需可视化监控,可额外部署
memcached-admin容器,它依赖主 Memcached 服务但不共享数据卷
通用最佳实践
无论数据库还是缓存,持久化配置需遵循统一原则:
- 在
volumes顶层明确定义命名卷(如mysql_data:、redis_data:),不写具体路径 - 每个服务的
volumes字段中引用该命名卷,并指定容器内路径(如- mysql_data:/var/lib/mysql) - 启动后用
docker volume ls和docker volume inspect确认卷已创建且挂载成功 - 定期备份卷:用临时容器打包卷内容导出到主机,例如
docker run --rm -v mysql_data:/volume -v $(pwd):/backup alpine tar cf /backup/mysql_backup.tar -C /volume .
