本文章为原创内容,只发布于 CSDN 博客 和 我的私人博客,转载请注明,谢谢
基于 Docker 的 Django 容器化部署教程分为三部分,当前所在的是第三部分
- 基于 Docker 的 Django 容器化部署之一:定制属于自己的 docker 镜像
- 基于 Docker 的 Django 容器化部署之二:docker-compose 部署 Django 项目
- 基于 Docker 的 Django 容器化部署之三:定时备份,两步实现服务器迁移
在 Django
博客进行 Docker
容器化之后,所需要的就是定时备份功能,能够将数据随时迁移到任何地方,毕竟容器化进行部署需要的就是轻量和易用。
既然备份了就要能够恢复数据,这样在迁移的时候,就可以保证数据不会丢失。
看了这个教程,简单几个命令就可以实现无损迁移项目。
脚本
自己编写的 shell
脚本 migrate.sh
功能:
- 自动备份
- 自动清理
- 自动恢复
- 自动设置备份规则
#!/bin/bash
mysql_db=hw_mysql
mysql_table=website
mysql_username=root
mysql_password=zhwei.cn
meida_dir=./django/media
backup_dir=./backup
backup_dir_date=${backup_dir}/`date +%Y-%m-%d`
backup_date=`date +%Y%m%d-%H%M`
if [ ! -n "$1" ] ;then
echo -e "\nUsage: migrate [-b] [-c] [-r <*.sql.gz> <*.tar.gz>] [-t <\"0 3 * * *\">]\n"
echo " -b, backup mysql and media"
echo " -c, clean old-to-date backup"
echo " -r, restore mysql and media"
echo -e " -t, set cron schedule expressions\n"
fi
while getopts :bcr:t: opt
do
case $opt in
b)
echo -e "\n----- Current start Backup -----"
echo "1. mkdir backup filedir: ${backup_dir_date}"
mkdir -p ${backup_dir_date}
echo "2. Backup MySQL to ${backup_dir_date}"
docker exec ${mysql_db} /usr/bin/mysqldump -u ${mysql_username} --password=${mysql_password} ${mysql_table} | gzip > ${backup_dir_date}/website-${backup_date}.sql.gz
echo "3. Backup media to ${backup_dir_date}"
tar -zcvf ${backup_dir_date}/media-${backup_date}.tar.gz ${meida_dir}
echo -e "----- Backup Success! -----\n"
;;
c)
echo -e "\n----- Current start Clean -----"
echo "1. Remove old-to-date website-*.sql"
find ${backup_dir} -mtime +1 -name "*.sql.gz" -exec rm -rf {} \;
echo "2. Remove old-to-date media-*.tar.gz"
find ${backup_dir} -mtime +1 -name "*.tar.gz" -exec rm -rf {} \;
echo "3. Remove empty filedir"
while [ "$(find ${backup_dir} -empty)" ]; do find ${backup_dir} -empty | xargs -i rm -r {}; done
echo -e "----- Clean Success! -----\n"
;;
r)
backup_sql=$2
backup_meida=$3
echo -e "\n----- Current start Restore -----"
echo "1. Unzip ${backup_sql}"
gzip -cd ${backup_sql} > ${backup_sql%.*}
echo "2. Restore MySQL Databases"
cat ${backup_sql%.*} | docker exec -i ${mysql_db} /usr/bin/mysql -u ${mysql_username} --password=${mysql_password} ${mysql_table}
echo "3. Restore Media File"
tar -zxvf ${backup_meida}
echo -e "----- Restore Done! -----\n"
;;
t)
echo "
$2$3$4$5$6 cd `pwd` && sh migrate.sh -b -c
" >> /var/spool/cron/root
echo "Like crontab -e. Set cron schedule expressions: $2$3$4$5$6"
echo "Command:cd `pwd` && sh migrate.sh -b -c"
;;
?)
echo -e "\nUsage: migrate [-b] [-c] [-r <*.sql.gz> <*.tar.gz>] [-t <\"0 3 * * *\">]\n"
echo " -b, backup mysql and media"
echo " -c, clean old-to-date backup"
echo " -r, restore mysql and media"
echo -e " -t, set cron schedule expressions\n"
exit 1
esac
done
使用方法
Usage: migrate [-b] [-c] [-r <*.sql.gz> <*.tar.gz>] [-t <"0 3 * * *">]
-b, backup mysql and media
-c, clean old-to-date backup
-r, restore mysql and media
-t, set cron schedule expressions
sh migrate -b
开始备份sh migrate -c
开始清理旧文件sh migrate -r *.sql.gz *.tar.gz
开始恢复,注意顺序sh migrate -t "0 3 * * *"
定时备份规则
备份
从我的 Django
项目来看,我要迁移的数据无非就是这两个
MySQL
数据库的备份media
媒体文件,图片、视频、音乐之类的
操作
sh migrate.sh -b
如果脚本保持默认,即将 MySQL备份(*.sql.gz)
和 media备份(*.tar.gz)
存入 backup/****-**-**/文件夹中
,请按需修改
目录
.
└── backup/
├── 2019-12-11/
│ ├── media-20191211-1235.tar.gz
│ └── website-20191211-1235.sql.gz
├── 2019-12-12/
│ ├── media-20191212-0326.tar.gz
│ └── website-20191212-0326.sql.gz
└── 2019-12-13/
├── media-20191213-1624.tar.gz
└── website-20191213-1624.sql.gz
清理
因为定时备份会占用很大的硬盘空间,而硬盘空间又是有限的,所以要定时清理,当前默认只保存 3 天的备份
sh migrate.sh -c
开启定时备份
我使用的是 Linux
自带的 crontab
定时任务。
定时备份是一个好习惯,不要等到了服务器崩了的时候再去备份,那样可能会很麻烦。
以下操作 需要使用 root
用户
sh migrate.sh -t "0 3 * * *"
- “0 3 _ _ *“ 是备份的周期,表示每天凌晨 3 点备份一次,参考时间规则查询网站:crontab guru
原理:
- 输入
crontab -e
- 添加内容:
0 3 * * * cd 目录 && sh migrate.sh -b -c
- 保存退出
crontab 命令查询
- 查看当前用户的定时任务
crontab -l
- 检查
cron
服务是不是在运行
service crond status
[root@localhost blogtest]# service crond status
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 五 2019-12-06 15:42:39 CST; 1 weeks 2 days ago
Main PID: 30726 (crond)
Tasks: 1
Memory: 1.2M
CGroup: /system.slice/crond.service
└─30726 /usr/sbin/crond -n
12月 16 10:12:01 localhost.localdomain crond[30726]: (root) RELOAD (/var/spool/cron/root)
...
cron
不在运行启动服务
service cron start
- 查看定时任务日志执行信息
tail -f /var/log/cron
备份文件的导出和导入
导出
手动导出或者利用 e-mail
将备份文件定时发到自己邮箱,这个按需使用吧,基于Python的邮件模块
可以参考我的 基于 Python 的邮件发送模块封装,只要配置邮箱基本信息就可发送。
导入
- 放在项目根目录,
sql
无所谓,但media
还是要的,所以干脆都放相同目录 - 项目容器运行,可用
docker-compose ps
查看
目录:
.
├── django
├── migrate.sh
├── docker-compose.yml
├── media-20191212-0326.tar.gz
├── nginx
└── website-20191212-0326.sql.gz
恢复
在一台新服务器上恢复项目,只需安装 docker
和 docker-compose
后,运行容器,恢复数据,即可完成迁移的全部工作
sh migrate.sh -r *.sql.gz *.tar.gz
自动 导入sql文件
和 解压静态媒体文件
好了,导入文件
,恢复SQL和mdeia
,两步就完成了服务器的迁移,用的了五分钟?那在导入文件的时间一定用了四分五十九秒~~
就这样,神奇的事情发生了,一切数据全部保留~ enjoy~~