注意:部分文章发布时间较长,可能存在未知因素,购买时建议在本站搜索商家名称,先充分了解商家动态。
交流:唯一投稿邮箱:hostvps@88.com。
目录
- 一、背景:
- 二、设计思路:
- 三、编写启动脚本
- 四、构建镜像
-   			五、添加边车容器
- 5.1 创建配置文件
- 5.2 创建有状态服务部署文件
 
-   			六、测试
项目地址及使用说明:https://gitee.com/noovertime/mysqlmail
一、背景:
一开始的初衷是,想写一个脚本来监控服务器的高占用率进程并通过邮件发送给我,然后突发奇想,可以使用这种方式来备份我的数据库,开始动手!
二、设计思路:
通过编写shell脚本,调用linux的mail工具,mysqldump的方式来保存数据库的sql文件,通过mail工具添加到附件,最后发送到我的邮箱。
三、编写启动脚本
  	首先我们来编写一个启动脚本
  	为了方便以后的个性化配置,我们将脚本中的变量都提取到一个application.yml文件中,文件如下:
|   								1   								2   								3   								4   								5   								6 | RUNTIME: 084900 ##启动时间,因为容器时区问题,需要当前时间减去8小时HOST: 172.17.0.3 ##数据库IP地址USER: root ##数据库用户PASSWORD: 123456 ##数据库密码DATABASE: solo ##数据库名TARGETMAIL: 1849539179@qq.com ##发送的邮箱地址 | 
接下来我们来写一下shell脚本,逻辑也很简单,当前时间与启动时间相同时,则调用sendmail函数发送邮件
|   								1   								2   								3   								4   								5   								6   								7   								8   								9   								10   								11   								12   								13   								14   								15   								16   								17   								18   								19   								20   								21   								22   								23   								24   								25   								26   								27 | #!/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.sql  echo-e "mysqlbak_$CURRENT_TIME"|mail -s "mysqlbak_$CURRENT_TIME"-a $DATABASE.sql $TARGETMAIL  sleep1}whiletruedo  CURRENT_TIME=$(date+%H%M%S)  if[ $CURRENT_TIME = $RUNTIME ];then    echo"starting bak mysql database"    sendmail    continue  else    echo$CURRENT_TIME    sleep1  fidone | 
四、构建镜像
  	因为我们最后要放到k8s平台上的,所以我们要构建一个镜像,在构建镜像之前,请先把application.yml demo.sh Dockerfile放在同一目录下
  	Dockerfile如下:
  	PS:添加了mysql的客户端,邮件mail客户端
|   								1   								2   								3   								4   								5   								6 | FROM centosRUN mkdir/app&& yum install-y mysql.x86_64 sendmail  mailx libreport-plugin-mailx WORKDIR /appCOPY demo.sh .COPY application.yml .CMD ["/bin/sh","demo.sh"] | 
使用docker build命令构建镜像,要记得加一下最后的点
|   								1 | docker build -t mysqlmail-bak:1.0.1 . | 
五、添加边车容器
边车容器(sidecar):边车容器就是与主容器一起在一个pod中运行的容器,为业务容器赋能,共享一个网络空间,所以可以用127.0.0.1:3306连接主容器的数据库。
5.1 创建配置文件
  	为了方便调试,我把里面的shell脚本也挂载出来。
  	创建两个configmap,分别对应容器内的配置文件与shell脚本,后面如果不需要调试可以取消mysqlshell的挂载。
|   								1   								2   								3   								4   								5   								6   								7   								8   								9   								10   								11   								12   								13   								14   								15   								16   								17   								18   								19   								20   								21   								22   								23   								24   								25   								26   								27   								28   								29   								30   								31   								32   								33   								34   								35   								36   								37   								38   								39   								40   								41   								42   								43   								44   								45   								46 | apiVersion: v1kind: ConfigMapmetadata:  name: mysqlmail-conf  namespace: solodata:  application.yml: |    RUNTIME: 105800    HOST: 127.0.0.1    USER: root    PASSWORD: 123456    DATABASE: solo    TARGETMAIL: 1849539179@qq.com---apiVersion: v1kind: ConfigMapmetadata:  name: mysqlmail-shell  namespace: solodata:  demo.sh: |    #!/bin/bash    #author: chenteng    RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')    HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')    USER=$(cat ./application.yml | grep USER| awk '{print $2}')    PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')    DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')    TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')    function  sendmail(){      mysqldump -h$HOST  -u$USER -p$PASSWORD  --complete-insert --skip-add-drop-table  --column-statistics=0 --hex-blob $DATABASE  > $DATABASE.sql      echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL      sleep 1    }    while true    do       CURRENT_TIME=$(date +%H%M%S)      if [ $CURRENT_TIME = $RUNTIME ];then        echo "starting bak mysql database"        sendmail        continue      else        echo $CURRENT_TIME        sleep 1      fi    done | 
5.2 创建有状态服务部署文件
我们的deploy文件使用的是上篇文章中创建的mysql有状态服务的yaml,有兴趣的可以看下我上篇迁移的文章
|   								1   								2   								3   								4   								5   								6   								7   								8   								9   								10   								11   								12   								13   								14   								15   								16   								17   								18   								19   								20   								21   								22   								23   								24   								25   								26   								27   								28   								29   								30   								31   								32   								33   								34   								35   								36   								37   								38   								39   								40   								41   								42   								43   								44   								45   								46   								47   								48   								49   								50   								51   								52   								53   								54   								55   								56   								57   								58   								59   								60   								61   								62   								63   								64   								65   								66   								67   								68   								69   								70   								71   								72 | apiVersion: apps/v1kind: StatefulSetmetadata:  name: mysql  namespace: solospec:  serviceName: mysql-service  selector:    matchLabels:      app: mysql  replicas: 1  template:    metadata:      labels:        app: mysql    spec:      containers:      - name: mysqlmail-bak        imagePullPolicy: IfNotPresent        image: mysqlmail-bak:1.0.1        volumeMounts:        - name: mysqlmail-conf          mountPath: /app/application.yml          subPath: application.yml        - name: mysqlmail-shell          mountPath: /app/demo.sh          subPath: demo.sh      - name: mysql-pod        imagePullPolicy: IfNotPresent        image: mysql:5.7        env:        - name: MYSQL_ROOT_PASSWORD          value: "123456"        ports:        - containerPort: 3306          name: msyql-listin        volumeMounts:        - name: mysql-data          mountPath: /var/lib/mysql          subPath: mysql-data        - name: mysql-conf          mountPath: /etc/mysql/conf.d/my.cnf          subPath: my.cnf      volumes:      - name: mysql-data        hostPath:          path: /data/mysql      - name: mysql-conf        configMap:          name: mysql-conf      - name: mysqlmail-conf        configMap:           name: mysqlmail-conf      - name: mysqlmail-shell        configMap:          name: mysqlmail-shell---apiVersion: v1kind: Servicemetadata:  name: mysql-service  namespace: solo  labels:    app: mysqlspec:  ports:  - targetPort: 3306    port: 3306  clusterIP: None  selector:     app: mysql | 
六、测试
  	我们上面给他定的时间是RUNTIME: 105800,上海时区也就是18点58分,我们来看一下效果
  	查看日志,
  	注意: 当一个pod包含多个容器时,要使用 -c 参数指定查看哪个容器
|   								1   								2   								3   								4   								5   								6   								7   								8   								9   								10 | [root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0  -c mysqlmail-bak | grep mysql -C 5105755105756105757105758105759starting bak mysql databasemysqldump: [Warning] Using a password on the command line interface can be insecure.105801105802 | 
从日志可以看到,邮件已经发送成功了!我们来去邮箱看一下,发现也已经成功了,至此我们的实验完美完成!
  	 贝壳主机网、bkvps.com
贝壳主机网、bkvps.com
到此这篇关于Docker容器定时备份数据库并发送到指定邮箱的文章就介绍到这了,更多相关Docker定时备份数据库内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
 贝壳主机网
贝壳主机网








