Docker容器怎么定时备份数据库并发送到指定邮箱(docker,数据库,开发技术)

时间:2024-05-04 18:39:26 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

一、背景:

一开始的初衷是,想写一个脚本来监控服务器的高占用率进程并通过邮件发送给我,然后突发奇想,可以使用这种方式来备份我的数据库,开始动手!

二、设计思路:

通过编写shell脚本,调用linux的mail工具,mysqldump的方式来保存数据库的sql文件,通过mail工具添加到附件,最后发送到我的邮箱。

三、编写启动脚本

首先我们来编写一个启动脚本
为了方便以后的个性化配置,我们将脚本中的变量都提取到一个application.yml文件中,文件如下:

RUNTIME:084900##启动时间,因为容器时区问题,需要当前时间减去8小时HOST:172.17.0.3##数据库IP地址USER:root##数据库用户PASSWORD:123456##数据库密码DATABASE:solo##数据库名TARGETMAIL:1849539179@qq.com##发送的邮箱地址

接下来我们来写一下shell脚本,逻辑也很简单,当前时间与启动时间相同时,则调用sendmail函数发送邮件

#!/bin/bash#author:chentengRUNTIME=$(cat./application.yml|grepRUNTIME|awk'{print$2}')HOST=$(cat./application.yml|grepHOST|awk'{print$2}')USER=$(cat./application.yml|grepUSER|awk'{print$2}')PASSWORD=$(cat./application.yml|grepPASSWORD|awk'{print$2}')DATABASE=$(cat./application.yml|grepDATABASE|awk'{print$2}')TARGETMAIL=$(cat./application.yml|grepTARGETMAIL|awk'{print$2}')functionsendmail(){mysqldump-h$HOST-u$USER-p$PASSWORD--complete-insert--skip-add-drop-table--hex-blob$DATABASE>$DATABASE.sqlecho-e"mysqlbak_$CURRENT_TIME"|mail-s"mysqlbak_$CURRENT_TIME"-a$DATABASE.sql$TARGETMAILsleep1}whiletruedoCURRENT_TIME=$(date+%H%M%S)if[$CURRENT_TIME=$RUNTIME];thenecho"startingbakmysqldatabase"sendmailcontinueelseecho$CURRENT_TIMEsleep1fidone

四、构建镜像

因为我们最后要放到k8s平台上的,所以我们要构建一个镜像,在构建镜像之前,请先把application.yml demo.sh Dockerfile放在同一目录下
Dockerfile如下:
PS:添加了mysql的客户端,邮件mail客户端

FROMcentosRUNmkdir/app&&yuminstall-ymysql.x86_64sendmailmailxlibreport-plugin-mailxWORKDIR/appCOPYdemo.sh.COPYapplication.yml.CMD["/bin/sh","demo.sh"]

使用docker build命令构建镜像,要记得加一下最后的点

dockerbuild-tmysqlmail-bak:1.0.1.

五、添加边车容器

边车容器(sidecar):边车容器就是与主容器一起在一个pod中运行的容器,为业务容器赋能,共享一个网络空间,所以可以用127.0.0.1:3306连接主容器的数据库。

5.1 创建配置文件

为了方便调试,我把里面的shell脚本也挂载出来。
创建两个configmap,分别对应容器内的配置文件与shell脚本,后面如果不需要调试可以取消mysqlshell的挂载。

apiVersion:v1kind:ConfigMapmetadata:name:mysqlmail-confnamespace:solodata:application.yml:|RUNTIME:105800HOST:127.0.0.1USER:rootPASSWORD:123456DATABASE:soloTARGETMAIL:1849539179@qq.com---apiVersion:v1kind:ConfigMapmetadata:name:mysqlmail-shellnamespace:solodata:demo.sh:|#!/bin/bash#author:chentengRUNTIME=$(cat./application.yml|grepRUNTIME|awk'{print$2}')HOST=$(cat./application.yml|grepHOST|awk'{print$2}')USER=$(cat./application.yml|grepUSER|awk'{print$2}')PASSWORD=$(cat./application.yml|grepPASSWORD|awk'{print$2}')DATABASE=$(cat./application.yml|grepDATABASE|awk'{print$2}')TARGETMAIL=$(cat./application.yml|grepTARGETMAIL|awk'{print$2}')functionsendmail(){mysqldump-h$HOST-u$USER-p$PASSWORD--complete-insert--skip-add-drop-table--column-statistics=0--hex-blob$DATABASE>$DATABASE.sqlecho-e"mysqlbak_$CURRENT_TIME"|mail-s"mysqlbak_$CURRENT_TIME"-a$DATABASE.sql$TARGETMAILsleep1}whiletruedoCURRENT_TIME=$(date+%H%M%S)if[$CURRENT_TIME=$RUNTIME];thenecho"startingbakmysqldatabase"sendmailcontinueelseecho$CURRENT_TIMEsleep1fidone

5.2 创建有状态服务部署文件

我们的deploy文件使用的是上篇文章中创建的mysql有状态服务的yaml,有兴趣的可以看下我上篇迁移的文章

apiVersion:apps/v1kind:StatefulSetmetadata:name:mysqlnamespace:solospec:serviceName:mysql-serviceselector:matchLabels:app:mysqlreplicas:1template:metadata:labels:app:mysqlspec:containers:-name:mysqlmail-bakimagePullPolicy:IfNotPresentimage:mysqlmail-bak:1.0.1volumeMounts:-name:mysqlmail-confmountPath:/app/application.ymlsubPath:application.yml-name:mysqlmail-shellmountPath:/app/demo.shsubPath:demo.sh-name:mysql-podimagePullPolicy:IfNotPresentimage:mysql:5.7env:-name:MYSQL_ROOT_PASSWORDvalue:"123456"ports:-containerPort:3306name:msyql-listinvolumeMounts:-name:mysql-datamountPath:/var/lib/mysqlsubPath:mysql-data-name:mysql-confmountPath:/etc/mysql/conf.d/my.cnfsubPath:my.cnfvolumes:-name:mysql-datahostPath:path:/data/mysql-name:mysql-confconfigMap:name:mysql-conf-name:mysqlmail-confconfigMap:name:mysqlmail-conf-name:mysqlmail-shellconfigMap:name:mysqlmail-shell---apiVersion:v1kind:Servicemetadata:name:mysql-servicenamespace:sololabels:app:mysqlspec:ports:-targetPort:3306port:3306clusterIP:Noneselector:app:mysql

六、测试

我们上面给他定的时间是RUNTIME: 105800,上海时区也就是18点58分,我们来看一下效果
查看日志,
注意: 当一个pod包含多个容器时,要使用 -c 参数指定查看哪个容器

[root@VM-24-15-centossolo]#kubectllogs-nsolomysql-0-cmysqlmail-bak|grepmysql-C5105755105756105757105758105759startingbakmysqldatabasemysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.105801105802

从日志可以看到,邮件已经发送成功了!我们来去邮箱看一下,发现也已经成功了,至此我们的实验完美完成!

Docker容器怎么定时备份数据库并发送到指定邮箱

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Docker容器怎么定时备份数据库并发送到指定邮箱的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python+OpenCV如何实现基于颜色的目标识别下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18