1.步骤

首先安装Docker

  1. yum install docker

然后我们先拉取MySQL的镜像

  1. docker pull mysql:5.7.13

1.png
然后我们用3306与3307端口分别启动主从两个MySQL服务

  1. docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  2. docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

2.png
两个都已经启动了,我们开始先配置主机

(一)配置主机

首先我们进入容器内部

  1. docker exec -it mysql-master /bin/bash

然后我们安装vim,便于我们在容器内部修改配置文件

  1. apt-get update
  2. apt-get install vim

配置my.cnf文件

  1. vim /etc/mysql/my.cnf

配置如下内容

  1. [mysqld]
  2. ## 同一局域网内注意要唯一
  3. server-id=100
  4. ## 开启二进制日志功能,可以随便取(关键)
  5. log-bin=mysql-bin

然后在主库创建一个新用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于同步数据

  1. CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
  2. GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  3. FLUSH PRIVILEGES;

然后重启容器

(二)配置从机

配置如下内容

  1. [mysqld]
  2. ## 设置server_id,注意要唯一
  3. server-id=101
  4. ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
  5. log-bin=mysql-slave-bin
  6. ## relay_log配置中继日志
  7. relay_log=edu-mysql-relay-bin

然后重启容器

(三)最后一步

进入主机的MySQL,执行show master status,记下File和Position字段的值,以下情况分两种来讨论

1.没有任何数据搭建主从复制的话,直接在从机中执行

  1. change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 154, master_connect_retry=30;

查询docker容器ip:docker inspect —format=’{{.NetworkSettings.IPAddress}}’ mysql-master

2.如果有数据搭建主从复制,则需要先锁库

进入主机的库

  1. flush tables with read lock;

然后执行show master status,记下File和Position字段的值

然后dump一份数据后解锁

  1. mysqldump -hhost -uroot -p123456 dbname > /opt/backup.sql
  2. UNLOCK TABLES;

导入从库

  1. source backup.sql

3.在从机中执行

  1. change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 154, master_connect_retry=30;

master_port:Master的端口号,指的是容器的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;
3.png
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

2.遇到的问题

(一)Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker
解决方式:
第一步:vim /etc/sysconfig/network-scripts/ifcfg-ens32
新增一行:DNS1=114.114.114.114
第二步:vim /etc/resolv.conf
新增一行:nameserver 114.114.114.114
第三步:systemctl restart network

参考链接:https://blog.csdn.net/baidu_21349635/article/details/104328556

(二)WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方式:
第一步:在宿主机上执行:echo “net.ipv4.ip_forward=1” >>/usr/lib/sysctl.d/00-system.conf
第二步:重启network和docker服务:systemctl restart network && systemctl restart docker

参考链接:https://www.cnblogs.com/python-wen/p/11224828.html