Ubuntu下Docker备份Hyperf数据需解耦运行时数据:①用mysqldump+gzip导出数据库;②docker cp复制Redis RDB文件;③tar归档挂载的上传目录;④通过Shell脚本与crontab自动化执行并清理旧备份。

在Ubuntu上用Docker快速备份Hyperf数据,核心是把Hyperf应用的运行时数据(主要是数据库、缓存、上传文件)与容器环境解耦,再通过标准化命令完成快照式备份。不建议直接备份容器或镜像,而应聚焦于可持久化的数据层。
明确要备份的关键数据源
Hyperf应用的数据通常分散在以下位置,需分别处理:
- MySQL/PostgreSQL数据库:业务核心数据,必须导出SQL或逻辑备份
- Redis缓存(如Session、队列):非必需持久化,但若需保留任务状态或会话,可RDB快照导出
-
上传文件目录(如
public/uploads或挂载卷):属于静态资产,适合用tar归档 -
配置与环境变量:已随Docker Compose或
.env文件管理,本身无需单独备份,但需确保其版本受控(如Git)
用Docker命令一键备份数据库(推荐mysqldump)
假设你用docker-compose.yml启动了mysql服务,且Hyperf连接名为db的容器:
执行以下命令导出数据库(替换your_db_name和backup_user):
docker exec db mysqldump -u backup_user -p'your_password' your_db_name | gzip > /backup/hyperf_db_$(date +\%Y\%m\%d_\%H\%M).sql.gz
说明:
- 使用
gzip实时压缩,节省空间 - 时间戳命名便于识别和清理旧备份
- 密码写在命令中虽方便,生产环境建议改用
mysql_config_editor或挂载.my.cnf配置文件
备份Redis与上传文件(同步归档)
如果Redis以容器方式运行(如服务名redis),且启用了RDB持久化(默认save 900 1),可直接复制RDB文件:
docker cp redis:/data/dump.rdb /backup/redis_dump_$(date +\%Y\%m\%d).rdb
对于上传目录(假设挂载到宿主机/opt/hyperf/uploads):
tar -czf /backup/hyperf_uploads_$(date +\%Y\%m\%d).tar.gz -C /opt/hyperf uploads
注意:uploads目录必须是Docker卷或绑定挂载的路径,不能是容器内未持久化的临时路径。
自动化:用Shell脚本+crontab定时执行
新建/opt/hyperf-backup/backup.sh:
#!/bin/bash BACKUP_DIR="/backup" mkdir -p $BACKUP_DIR # 备份DB docker exec db mysqldump -u backup_user -p'xxx' hyperf_db | gzip > $BACKUP_DIR/db_$(date +\%Y\%m\%d_\%H\%M).sql.gz # 备份Redis RDB docker cp redis:/data/dump.rdb $BACKUP_DIR/redis_$(date +\%Y\%m\%d).rdb 2>/dev/null || true # 备份上传文件 tar -czf $BACKUP_DIR/uploads_$(date +\%Y\%m\%d).tar.gz -C /opt/hyperf uploads # 清理7天前的备份 find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete find $BACKUP_DIR -name "*.rdb" -mtime +7 -delete find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
赋予执行权限并加入定时任务:
chmod +x /opt/hyperf-backup/backup.sh # 每天凌晨2:30执行 echo "30 2 * * * /opt/hyperf-backup/backup.sh" | crontab -
恢复时的操作要点
恢复不是“一键还原”,而是按数据类型分步操作:
-
数据库:先创建空库,再用
zcat backup.sql.gz | docker exec -i db mysql -u root -p'xxx' hyperf_db -
Redis:停掉redis容器 → 替换
/var/lib/redis/dump.rdb→ 启动容器(确保stop-writes-on-bgsave-error no等配置兼容) -
上传文件:解压到原挂载路径,确认宿主机目录权限为
www-data或Hyperf运行用户可读
整个过程不依赖Hyperf框架内部机制,完全基于Docker标准操作,轻量、可验证、易迁移。


















