1.步骤
首先安装Docker
yum install docker
然后我们先拉取MySQL的镜像
docker pull mysql:5.7.13
然后我们用3306与3307端口分别启动主从两个MySQL服务
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
两个都已经启动了,我们开始先配置主机
(一)配置主机
首先我们进入容器内部
docker exec -it mysql-master /bin/bash
然后我们安装vim,便于我们在容器内部修改配置文件
apt-get update
apt-get install vim
配置my.cnf文件
vim /etc/mysql/my.cnf
配置如下内容
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
然后在主库创建一个新用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于同步数据
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
然后重启容器
(二)配置从机
配置如下内容
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
然后重启容器
(三)最后一步
进入主机的MySQL,执行show master status,记下File和Position字段的值,以下情况分两种来讨论
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.如果有数据搭建主从复制,则需要先锁库
进入主机的库
flush tables with read lock;
然后执行show master status,记下File和Position字段的值
然后dump一份数据后解锁
mysqldump -hhost -uroot -p123456 dbname > /opt/backup.sql
UNLOCK TABLES;
导入从库
source backup.sql
3.在从机中执行
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;
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