文章目录
Dockerfile制作mysql主从镜像
如果使用我本人制作好的mysql主从镜像,则请忽略这个步骤,直接调到下一步"搭建mysql主从"。若想自己制作mysql主从镜像,则
mysql-master镜像制作
Dockerfile文件内容如下:
FROM mysql:5.7
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
my.cnf文件内容如下:
[mysqld]
##################基础设置##################
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=1
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect=‘SET NAMES utf8mb4‘
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
##################主从复制设置##################
#开启mysql binlog功能
log-bin=/var/log/mysql/mysql-bin.index
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
将Dockerfile和my.cnf放在同一目录下,然后执行:
docker build -t mysql-master:5.7 .
mysql-slave镜像制作
Dockerfile文件内容如下:
FROM mysql:5.7
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
my.cnf文件内容如下:
[mysqld]
##################基础设置##################
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=2
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect=‘SET NAMES utf8mb4‘
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
##################主从复制设置##################
#开启mysql binlog功能
log-bin=/var/log/mysql/mysql-bin.index
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
将Dockerfile和my.cnf放在同一目录下,然后执行:
docker build -t mysql-master:5.7 .
查看制作好的两个镜像:
制作好的两个镜像可以上传到docker hub公共仓库,方便以后搭建mysql主从,直接从仓库下载这两个镜像。推送镜像到公共仓库请参考我写的另一篇文章:Docker第五篇-Docker镜像推送公共仓库
搭建mysql主从
获取镜像
可以使用上面创建的两个镜像,这里我使用我自己仓库上面的镜像(因为我已经把上面制作好的镜像上传到我个人仓库)
docker pull dalomao/mysql-master:5.7
docker pull dalomao/mysql-slave:5.7
宿主机创建目录用来挂载
宿主机创建两个目录,用来分别挂载主从容器中的数据,这样子将主从的数据挂载到宿主机,可以防止容器被意外删除或宕机是,数据在宿主机仍有备份(日志无需挂载)
mkdir -p /home/mysql/master-data
mkdir -p /home/mysql/slave-data
启动主从mysql容器
#启动mysql-master
docker run \
--name mysql-master \
--privileged=true \
-v /home/mysql/master-data:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-d dalomao/mysql-master:5.7
#启动mysql-slave
docker run \
--name mysql-slave \
--privileged=true \
-v /home/mysql/slave-data:/var/lib/mysql \
-p 3307:3306 --link mysql-master:master \
-e MYSQL_ROOT_PASSWORD=root \
-d dalomao/mysql-slave:5.7
- privileged=true表示容器内的root用户拥有真正的root权限,这样可以在容器内看到宿主机的设备,并且执行mount,设置可以在容器内启动docker容器
- -v /home/mysql/slave-data:/var/lib/mysql表示将容器内的数据目录/var/lib/mysql挂载到宿主机/home/mysql/slave-data目录下
- -p 3307:3306表示宿主机端口3307映射容器内端口3306
- -e MYSQL_ROOT_PASSWORD=root表示设置容器中的mysql的root用户的密码
- 该镜像是我自己制作的镜像,已经包含内置的my.cnf配置。如果想重新覆盖内置的my.cnf配置,可以将该配置放在宿主机某个目录,然后使用以下命令进行覆盖:-v /home/mysql/etc/master:/etc/mysql/conf.d。其中/home/mysql/etc/master是宿主机目录,该目录下有.cnf结尾的配置文件,
/etc/mysql/conf.d是固定写法- 很多镜像,包括mysql镜像,它们的启动命令及配置如何覆盖等等,在docker hub仓库中都有说明的,因此在碰到不清楚的,一定记得看官方资料!!!
登录master容器授权
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
grant replication slave on *.* to 'test'@'%' identified by '123456';
flush privileges;
这里是直接授权*,如果指定IP授权的话,需要退出容器使用以下命令查看双方的IP:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
紧接着继续在master容器查看主机状态:
show master status;
这里一定要记住File和Position的值,等会在配置从机的时候会用到
登录slave容器并启动
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
change master to master_host='master', master_user='test', master_password='123456', \
master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=589, master_connect_retry=30;
start slave;
// 查看从的状态
show slave status\G
- master_log_file就是之前我们查看master主机的File
- master_log_pos就是之前我们查看master主机的Position
验证
在Navicat主机新增一个数据库,从机刷新,马上回同步到从机,验证成功!