1、下载镜像mysql
docker pull mysql
2、在home目录下创建一个mysql目录,在该目录下创建3个文件夹,分别为master、slave1、slave2,然后在该3个目录中创建3个目录为conf、data、logs和一个文件timezone。
3、首先,设置时区。在timezone中输入
"Asia/shanghai"
4、创建master容器
##端口对外3307 master mysql 密码设置为123456
docker run -p 3307:3306 --name mysql-master \
--restart=always \
--privileged=true \
-v /home/mysql/master/conf:/etc/mysql/conf.d \
-v /home/mysql/master/logs:/logs \
-v /home/mysql/master/data:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v /home/mysql/master/timezone:/etc/timezone \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
5、创建slave1容器
docker run -p 3308:3306 --name mysql-slave1 \
--restart=always \
--privileged=true \
-v /home/mysql/slave1/conf:/etc/mysql/conf.d \
-v /home/mysql/slave1/logs:/logs \
-v /home/mysql/slave1/data:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v /home/mysql/slave1/timezone:/etc/timezone \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
6、创建slave2容器
docker run -p 3309:3306 --name mysql-slave2 \
--restart=always \
--privileged=true \
-v /home/mysql/slave2/conf:/etc/mysql/conf.d \
-v /home/mysql/slave2/logs:/logs \
-v /home/mysql/slave2/data:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v /home/mysql/slave2/timezone:/etc/timezone \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
7、查看运行的三个节点容器
[root@iZbp1bq6vb70qq3lbmjlh0Z mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e0dbf519678c mysql "docker-entrypoint.s…" 39 minutes ago Up 39 minutes 33060/tcp, 0.0.0.0:3309->3306/tcp, :::3309->3306/tcp mysql-slave2
ea136391cef4 mysql "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave1
303e5b80fd20 mysql "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-master
8、创建主从节点的配置文件 server_id 唯一
在master/conf 中创建master.cnf 内容为:
[mysqld]
server-id=1
log-bin=mysql-bin
在slave1/conf 中创建slave.cnf
[mysqld]
server_id=2
log-bin=mysql-bin
binlog-format=ROW
在slave2/conf 中创建slave.cnf
[mysqld]
server_id=3
log-bin=mysql-bin
binlog-format=ROW
然后把3个容器都进行一次重启
另外,我们先看下这两个节点的容器真实ip,记下来,后面会用到。
命令:docker inspect 容器名称或者ID | grep IPAddress
[root@iZbp1bq6vb70qq3lbmjlh0Z mysql]# docker inspect mysql-master | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.18.0.2",
"IPAddress": "172.18.0.2",
[root@iZbp1bq6vb70qq3lbmjlh0Z mysql]#
9、mysql容器内部配置
先进入主库节点创建一个用户,待会从库使用该用户来实现基于log文件的主从复制。
进入主节点容器:
docker exec -it mysql-master /bin/bash
登录MySQL,当初记得我们创建的是root/123456
mysql -uroot -p
创建新用户并授权(user你自己定义,只要从库配置的时候别写错就行)
CREATE USER 'zhang-m'@'%' IDENTIFIED BY '123456';
//授权
GRANT REPLICATION SLAVE ON *.* TO 'zhang-m'@'%';
//刷新,切记要刷新 刷新,切记要刷新 刷新,切记要刷新
FLUSH PRIVILEGES;
//查看主库状态
show master status;
记清楚这里的bin-log文件是:mysql-bin.000004
,每个人可能不一样,这个数值一会从数据库配置有用的到。
接下来配置从数据库1
进入从库1的容器
docker exec -it mysql-slave1 /bin/bash
登录MySQL,数据库也是:root/123456
mysql -uroot -p
首先停止slave节点
stop slave;
配置
说明:
MASTER_HOST=172.18.0.2,是我们上面查询出的主库容器
MASTER_USER='zhang-m',使我们在master库中创建并授权的账户
MASTER_PORT=3306 默认3306
MASTER_LOG_FILE='mysql-bin.000004',这个是show master status;看到的file名称
CHANGE MASTER TO
MASTER_HOST='172.18.0.2',
MASTER_USER='zzj-m',
MASTER_PORT=3306,
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=1415;
然后重置slave
reset slave;
启动slave
start slave;
可以查看一下slave启动后的情况,查看一下基本信息以及最重要的从库的IO和SQL是否正常
从库信息较多,加上\G
参数查看方便。
show slave status \G;
这里mysql8.0 会出现一个问题
Authentication plugin ‘caching_sha2_password‘ reported error: Authentication
原因是主库zhang-m用户的plugin是caching_sha2_password 导致连接不上,修改为mysql_native_password即可解决。
解决办法:
进入主库mysql容器,切换到mysql数据库,然后执行
ALTER USER 'zhang-m'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
slave2同slave1一样的操作。
如何验证
我用Navicat管理工具给大家演示一下,连接上主库和2个从库。这里需要注意的是,可能会弹出提示
这里需要登录主库容器中,登录mysql 执行以下
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
这时在进行Navicat管理连接。
然后在主库中创建一个Hello数据库,创建一个hello表,表中填入一些数据,然后登录从库查看,是否拥有Hello数据库,hello表和数据。