一、拉取鏡像並運行mysql容器
Docker 官方公共倉庫 Docker Hub :https://hub.docker.com/
mysql官方鏡像:https://hub.docker.com/_/mysql
從鏡像倉庫拉取mysql5.7.27鏡像
sudo docker pull mysql:5.7.27
sudo docker rmi IMAGE ID #刪除鏡像
運行Mysql容器
sudo docker run --restart=always -p 3306:3306 --name mysql5.7.27 \
-v /longain/mysql/conf:/etc/mysql/conf.d \
-v /longain/mysql/logs:/logs \
-v /longain/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mysql@pwd -d mysql:5.7.27
mysql配置文件目錄 :/longain/mysql/conf
mysql日誌目錄:/longain/mysql/logs
mysql數據文件目錄:/longain/mysql/data
#進入mysql 容器
sudo docker exec -it mysql5.7.27 bash
#使用容器客戶端連接mysql:
sudo docker exec -it mysql5.7.27 mysql -uroot -pmysql@pwd
mysql主配置文件 my.cnf 加載了 /etc/mysql/conf.d 文件夾下所有的配置(後綴必須是 .cnf),我們只需映射 conf.d
文件夾即可。
宿主機 /longain/mysql/conf目錄下新建配置文件 my.cnf
[client]
#設置字符集爲uft-8
default-character-set=utf8
[mysqld]
#數據庫默認字符集
character-set-server=utf8
#設置client連接mysql時的字符集,防止亂碼
init_connect= SET NAMES utf8
#時區設置 北京時間
default-time-zone = '+8:00'
#server最大接受的數據包大小
max_allowed_packet = 128M
#最大連接數
max_connections = 300
sudo docker stop CONTAINER ID #停止容器
sudo docker start CONTAINER ID #啓動容器
sudo docker restart CONTAINER ID #重啓容器
sudo docker rm CONTAINER ID #刪除容器
二、構建mysql自動備份容器
Alpine基礎鏡像
Alpine Linux 是一個面向安全的輕型的 Linux 發行版。採用了 musl libc 和 busybox 以減小系統的體積和運行時資源消耗。在保持瘦身的同時,Alpine Linux 還提供了自己的包管理工具 apk,如:apk add、apk update、apk del。
關鍵的是,相比於其他 Linux 的 Docker 鏡像,它的容量非常小,僅僅只有5MB。
Alpine Linux 的官網:
http://www.alpinelinux.org
https://pkgs.alpinelinux.org/packages
apline 鏡像地址:https://hub.docker.com/_/alpine
Dockerfile:
FROM alpine:3.8
RUN apk add --no-cache mysql-client
ENTRYPOINT ["mysql"]
構建基礎鏡像:
sudo docker build -t mysql-backup:0.1 .
默認鏡像源可能比較慢,可以使用中科大鏡像源:http://mirrors.ustc.edu.cn/alpine/
需要重新構建 Dockerfile,如:
FROM alpine:3.8
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.8/main > /etc/apk/repositories
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.8/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN apk add mysql-client
ENTRYPOINT ["mysql"]
構建自動備份鏡像
創建腳本 mysqlbak.sh:
#!/bin/bash
#得到當前日期時間
current_time="`date +%Y-%m-%d_%H-%M-%S`"
#判斷目錄是否存在
if [ ! -d "/data/logs" ]; then
mkdir -p /data/logs
fi
#備份目錄
backupDir="/data/"
#寫入操作到日誌文件
logfile=/data/logs/mysqlbackup.log
#設置壓縮後的文件名
file1=${backupDir}${mysql_db1}-${current_time}'.tar.gz'
file2=${backupDir}${mysql_db2}-${current_time}'.tar.gz'
file3=${backupDir}${mysql_db3}-${current_time}'.tar.gz'
echo "[`date +"%Y-%m-%d %H:%M:%S"`]:開始備份..." >> $logfile
if [ -n "$mysql_db1" ]; then
mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db1 | gzip > $file1
echo "[`date +"%Y-%m-%d %H:%M:%S"`]:數據庫${mysql_db1}備份完成" >> $logfile
fi
if [ -n "$mysql_db2" ]; then
mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db2 | gzip > $file2
echo "[`date +"%Y-%m-%d %H:%M:%S"`]:數據庫${mysql_db2}備份完成" >> $logfile
fi
if [ -n "$mysql_db3" ]; then
mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db3 | gzip > $file3
echo "[`date +"%Y-%m-%d %H:%M:%S"`]:數據庫${mysql_db3}備份完成" >> $logfile
fi
echo "[`date +"%Y-%m-%d %H:%M:%S"`]:開始刪除超過7天的備份數據..." >> $logfile
oldDate=`date --date='7 day ago' +%Y-%m-%d`;
echo `rm -rf ${backupDir}${mysql_db1}-${oldDate}*.tar.gz`;
echo `rm -rf ${backupDir}${mysql_db2}-${oldDate}*.tar.gz`;
echo `rm -rf ${backupDir}${mysql_db3}-${oldDate}*.tar.gz`;
echo "[`date +"%Y-%m-%d %H:%M:%S"`]:刪除備份數據操作完成 END" >> $logfile
Dockerfile:
FROM mysql_backup:0.1
COPY ./mysqlbak.sh /
RUN chmod +x mysqlbak.sh
RUN apk add --no-cache tzdata #設置時區
ENV TZ Asia/Shanghai
ENV cron_conf "0 30 23 * * ? *" #每天23點30分觸發
RUN echo "$cron_conf /mysqlbak.sh" >> /var/spool/cron/crontabs/root
ENTRYPOINT ["crond","-f"]
構建鏡像:
sudo docker build -t mysql-backup:0.2 .
啓動mysql自動備份容器:
sudo docker run -d --restart=always --name mysql-backup \
-v /longain/mysql/backup:/data \
-e mysql_user=root \
-e mysql_pass=mysql@pwd \
-e mysql_host=mysql服務器IP \
-e mysql_db1=nsis_hldp \
-e mysql_db2=nsis_hldp_dsc \
-e mysql_db3=nsis_hldp_his \
mysql_backup:0.2
鏡像地址:https://hub.docker.com/r/longain/mysql-backup
大功告成!!!