Docker结合MySQL常用操作

本篇是一些Docker结合MySQL常用操作的笔记。这里MySQL版本为5.7。主要是使用Docker搭建MySQL并导入数据、基于alpine镜像构建MySQL客户端、制作MySQL备份专用镜像和使用crontab实现数据库定时备份。

启动MySQL容器、导入数据

拉取官方镜像 docker pull mysql:5.7
启动MySQL -e 设置环境变量 MYSQL_ROOT_PASSWORD 是root的密码
docker run --name mysql --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 -d mysql:5.7
测试连接 docker exec -it mysql mysql -u root -p123123 或者 docker exec -it mysql mysql -u root -p
实际运行必定要配置文件,根据官网的提示,配置文件在 /etc/mysql/my.cnf,数据目录在 /var/lib/mysql。

本地新建mysql目录,其中新建conf和data目录。conf挂载/etc/mysql/conf.d,data挂载/var/lib/mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim /home/xugz/mysql/conf/conf.cnf

# 下面是对应配置信息
[mysqld]
server-id = 1 #服务Id唯一 用于主从同步
port = 3306
log-error = /var/log/mysql/error.log #错误日志
#只能用IP地址
skip_name_resolve
#数据库默认字符集
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
#最大连接数
max_connections = 300

修改完成后启动,确定放行3306端口

1
2
3
docker run --name mysql --rm -p 3306:3306 \
-v /home/xugz/mysql/conf:/etc/mysql/conf.d -v /home/xugz/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123123 -d mysql:5.7

使用 docker logs 查看是否存在报错或者使用客户端进入MySQL确认配置是否生效。

1
2
3
docker exec -it mysql mysql -uroot -p123123
# 或者上行命令使用 docker exec -it mysql bash 然后 mysql -uroot -p123123 正常来说会进入mysql交互界面
show variables like '%max_connections%'; #查看最大连接数是否和配置一致用于判断配置是否生效。

利用容器执行命令导入SQL文件

1
2
3
4
5
docker cp test.sql mysql:/tmp
docker exec -it mysql mysql -uroot -p123123
create database test;
use test;
source /tmp/test.sql;

基于alpine构建MySQL客户端

alpine使用的是apk包管理器,命令,如apk add 、apk update 、apk del。默认镜像源可能比较慢,常用的有
中科大镜像源:http://mirrors.ustc.edu.cn/alpine/ 阿里云镜像源:http://mirrors.aliyun.com/alpine/

拉取官方镜像 docker pull alpine
新建目录 mkdir mytool 并在目录中新建Dockerfile文件,键入以下内容。安装MySQL客户端

1
2
3
4
5
6
FROM alpine:latest
RUN echo http://mirrors.aliyun.com/alpine/v3.10/main > /etc/apk/repositories
RUN echo http://mirrors.aliyun.com/alpine/v3.10/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN apk add mysql-client
ENTRYPOINT ["mysql"]

如果不知道当前 alpine的版本,可以通过 docker exec -it 容器名 sh 通过命令行方式进入容器 使用命令 cat /etc/issue 查看。

不使用dockerfile的话,手工配置加速镜像源使用命令
docker exec -it tmp sh -c "echo \"http://mirrors.aliyun.com/alpine/v3.10/main/\" > /etc/apk/repositories"
docker exec -it tmp sh -c "echo \"http://mirrors.aliyun.com/alpine/v3.10/community/\" >> /etc/apk/repositories"
当然设置好后,还得 执行apk update && apk upgrade

构建镜像,使用命令编译 docker build -t mytool:1.0 .
使用docker run -it --name tmp mytool:1.0 mysql -h 192.168.2.156 -uroot -p123123 运行验证。
这里的192.168.2.156是MySQL服务端部署主机的IP

alpine镜像官方文档

制作MySQL备份专用镜像

我们现在想要制作一个MySQL备份数据库数据的镜像,要求存放到指定目录 /home/xugz/mysql/database_bak/下,文件名与数据库名一致。
数据库备份命令mysqldump -u用户名 -p密码 数据库名 > 导出的文件名
修改原mytool目录中的Dockerfile文件,覆盖以下内容,注意需要去掉注释哦

1
2
3
4
5
6
FROM mytool:1.0 # 基于上文中alpine构建的MySQL客户端
ENV mysql_host 192.168.2.156 # 环境变量 目标连接服务器
ENV mysql_user root # 环境变量 默认用户为 root
ENV mysql_pass 123123 # 环境变量 连接mysql服务器主机对应用户的密码
ENV mysql_db test
ENTRYPOINT mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db > /data/$mysql_db.sql

构建镜像,使用命令编译docker build -t mytool:1.1 .
新建备份目录地址 mkdir database_bak
运行并挂载指定目录 docker run -it --name bakup --rm -v /home/xugz/mysql/database_bak:/data mytool:1.1

或者增加环境变量指定,用于跨主机备份,参考以下命令

1
2
3
docker run -it --name bakup --rm -v /home/xugz/mysql/database_bak:/data \
-e mysql_pass=qwe123 -e mysql_host=192.168.222.1 -e mysql_db=db_test_products -e mysql_user=root \
mytool:1.1

运行完成后,可到备份目标地址查看是否存在文件。

crontab定时备份数据表

一般我们先写个脚本文件,塞入计划语句,然后加入到计划任务中。

新建dbback目录,进入新建备份计划脚本文件 vi /bakup.sh 塞入以下内容

1
2
3
4
5
#!/bin/sh
if [ ! -d "/data" ]; then
mkdir /data
fi
mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db > /data/$mysql_db-$(date +%Y%m%d_%H%M%S).sql

保存文件后,授予脚本可执行权限 chmod +x bakup.sh。新建Dockerfile文件,添加以下内容,注意需要去掉注释哦

1
2
3
4
5
6
7
8
9
10
FROM mytool:1.0
ENV mysql_host 192.168.2.156
ENV mysql_user root
ENV mysql_pass 123123
ENV mysql_db test
COPY ./bakup.sh /
RUN chmod +x bakup.sh
ENV cron_conf "* * * * * "
RUN echo "$cron_conf /bakup.sh" >> /var/spool/cron/crontabs/root
ENTRYPOINT ["crond","-f"] # alpine中crond -f 命令为在客户端执行

执行编译 docker build -t mysqlbakup:1.0 .
使用下面命令运行,备份192.168.2.125主机上的db_test_products表

1
2
3
docker run -d --name bakup -v /home/xugz/mysql/database_bak:/data \
-e mysql_pass=qwe123 -e mysql_host=192.168.2.125 -e mysql_db=db_test_products -e mysql_user=root \
mysqlbakup:1.0

本文标题:Docker结合MySQL常用操作

文章作者:xugz

发布时间:2019年12月03日 - 12:22

最后更新:2021年09月11日 - 16:16

原始链接:https://xlline.github.io/2019/12/03/Docker-mysql-base/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。