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;

docker中namespace是干嘛的 docker zoneminder_linux

 记清楚这里的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;

docker中namespace是干嘛的 docker zoneminder_linux_02

这里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个从库。这里需要注意的是,可能会弹出提示

docker中namespace是干嘛的 docker zoneminder_docker_03

这里需要登录主库容器中,登录mysql 执行以下

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

 这时在进行Navicat管理连接。

然后在主库中创建一个Hello数据库,创建一个hello表,表中填入一些数据,然后登录从库查看,是否拥有Hello数据库,hello表和数据。