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 #删除容器
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
大功告成!!!