docker compose自动化备份需串联执行主体、导出内容、存储位置、执行周期、过期清理五要素;通过backup服务复用网络与卷,用docker exec调用容器内mysqldump,宿主机crontab定时调度并压缩加密+异地同步。

用 Docker Compose 实现自动化备份,核心不是堆功能,而是把“谁来执行、导出什么、存到哪、多久一次、过期怎么清”这五件事串成一条不掉链子的流水线。下面直接按实操逻辑分块说明,每一步都可复制粘贴运行。
备份脚本要能独立访问容器内数据库
不能靠宿主机装 mysqldump 或 pg_dump,得用容器自己的命令。关键点是通过 docker exec 进入数据库容器执行导出:
- 确认数据库服务名(如
mysql)和环境变量(如MYSQL_ROOT_PASSWORD)在docker-compose.yml中已定义 - 脚本里用
docker exec -i mysql mysqldump -uroot -p"$DB_PASS" myapp_db > /backup/myapp-$(date +%F).sql - 密码尽量从
.env文件读取,避免硬编码;若容器没挂载时区,加-e TZ=Asia/Shanghai防止时间错乱
备份服务要和主服务共用网络与卷
单独起一个 backup 服务,让它能连上数据库、也能写入本地目录:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 在
docker-compose.yml中增加服务,镜像用alpine:latest或debian:slim即可 - 必须声明
networks: [default],确保和 mysql 在同一网络,能用服务名互通 -
volumes要同时挂载:数据库容器的数据卷(只读)、本地备份目录(读写),例如:- mysql_data:/var/lib/mysql:ro- ./backups:/backup
定时任务走宿主机 crontab 最稳
别在容器里折腾 cron,容易因重启失效或时区混乱。统一由宿主机调度:
- 把备份脚本(如
/opt/apps/myapp/backup.sh)设为可执行:chmod +x backup.sh - 编辑
crontab -e,添加一行(每天凌晨2点执行):0 2 * * * cd /opt/apps/myapp && ./backup.sh > /dev/null 2>&1 - 脚本末尾加上自动清理逻辑:
find ./backups -name "*.sql.gz" -mtime +7 -delete,保留最近7天
备份文件建议压缩+加时间戳+异地同步
光有本地文件不够,得防单点故障:
- 导出后立刻 gzip 压缩:
gzip -f /backup/myapp-$(date +%F).sql - 文件名带完整时间戳,如
myapp-2026-06-19-0200.sql.gz,方便排序和定位 - 用
rsync或rclone同步到另一台服务器或对象存储,例如:rsync -avz --delete ./backups/ user@backup-server:/data/myapp-backup/










