您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Docker容器怎么定時備份數據庫并發送到指定郵箱,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
一開始的初衷是,想寫一個腳本來監控服務器的高占用率進程并通過郵件發送給我,然后突發奇想,可以使用這種方式來備份我的數據庫,開始動手!
通過編寫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: 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 --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
因為我們最后要放到k8s平臺上的,所以我們要構建一個鏡像,在構建鏡像之前,請先把application.yml demo.sh Dockerfile放在同一目錄下
Dockerfile如下:
PS:添加了mysql的客戶端,郵件mail客戶端
FROM centos RUN mkdir /app && yum install -y mysql.x86_64 sendmail mailx libreport-plugin-mailx WORKDIR /app COPY demo.sh . COPY application.yml . CMD ["/bin/sh","demo.sh"]
使用docker build命令構建鏡像,要記得加一下最后的點
docker build -t mysqlmail-bak:1.0.1 .
邊車容器(sidecar):邊車容器就是與主容器一起在一個pod中運行的容器,為業務容器賦能,共享一個網絡空間,所以可以用127.0.0.1:3306連接主容器的數據庫。
為了方便調試,我把里面的shell腳本也掛載出來。
創建兩個configmap,分別對應容器內的配置文件與shell腳本,后面如果不需要調試可以取消mysqlshell的掛載。
apiVersion: v1 kind: ConfigMap metadata: name: mysqlmail-conf namespace: solo data: application.yml: | RUNTIME: 105800 HOST: 127.0.0.1 USER: root PASSWORD: 123456 DATABASE: solo TARGETMAIL: 1849539179@qq.com --- apiVersion: v1 kind: ConfigMap metadata: name: mysqlmail-shell namespace: solo data: 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
我們的deploy文件使用的是上篇文章中創建的mysql有狀態服務的yaml,有興趣的可以看下我上篇遷移的文章
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql namespace: solo spec: 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: v1 kind: Service metadata: name: mysql-service namespace: solo labels: app: mysql spec: ports: - targetPort: 3306 port: 3306 clusterIP: None selector: app: mysql
我們上面給他定的時間是RUNTIME: 105800,上海時區也就是18點58分,我們來看一下效果
查看日志,
注意: 當一個pod包含多個容器時,要使用 -c 參數指定查看哪個容器
[root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0 -c mysqlmail-bak | grep mysql -C 5 105755 105756 105757 105758 105759 starting bak mysql database mysqldump: [Warning] Using a password on the command line interface can be insecure. 105801 105802
從日志可以看到,郵件已經發送成功了!我們來去郵箱看一下,發現也已經成功了,至此我們的實驗完美完成!
看完上述內容,你們對Docker容器怎么定時備份數據庫并發送到指定郵箱有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。