## 安装docker
yum install docker
##一路y下去
## 启动方式一
sudo systemctl start docker
## 启动方式二
service docker start
[root@localhost ~]# docker version
Client:
Version: 17.03.0-ce
API version: 1.26
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 08:10:07 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.0-ce
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 08:10:07 2017
OS/Arch: linux/amd64
Experimental: false
出现版本信息表示安装成功
systemctl enable docker.service
[root@localhost ~]# docker pull mysql:5.7.13
5.7.13: Pulling from library/mysql
5c90d4a2d1a8: Pull complete
89e2627e9201: Pull complete
76f6983b0fe0: Pull complete
653577605512: Pull complete
bd6c32d9a05f: Pull complete
0632c43d2f8e: Pull complete
e76bc01eb91c: Pull complete
c7fb4d78a4d6: Pull complete
438c1fb96f64: Pull complete
f3ed22f2810a: Pull complete
b836883cb3d9: Pull complete
Digest: sha256:a9a5b559f8821fe73d58c3606c812d1c044868d42c63817fa5125fd9d8b7b539
Status: Downloaded newer image for mysql:5.7.13
[root@localhost ~]# docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
21fa723b48e3ae6f6dab4969ec0140071f998f9bfd6b2d149faa76bd2831242f
--name 为容器指定名称,这里是master
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3306端口
-e 设置环境变量,这里是指定root账号的密码为root
-d 后台运行容器,并返回容器ID
mysql:5.7.13 指定运行的mysql版本
## 会显示所有的容器,已运行和未运行的 Up表示正在运行中的状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21fa723b48e3 mysql:5.7.13 "docker-entrypoint..." 12 seconds ago Up 11 seconds 0.0.0.0:3306->3306/tcp master
## --permanent 永久开启
[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
## 在MySQL中执行以下语句
grant replication slave on *.* to 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';
出现如图所示结果表示授权成功
回到CentOS
## 创建目录 /usr/local/mysql/master
## /usr/local/mysql/slave1
## /usr/local/mysql/slave2
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mkdir mysql
[root@localhost local]# cd mysql/
[root@localhost mysql]# mkdir master
[root@localhost mysql]# mkdir slave1
[root@localhost mysql]# mkdir slave2
[root@localhost mysql]# ls
master slave1 slave2
复制一份MySQL配置文件
[root@localhost mysql]# docker cp master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf
[root@localhost ~]# cd /usr/local/mysql/master/
[root@localhost master]# ls
my.cnf
编辑my.cnf
[root@localhost master]# vi my.cnf
在以下位置加入两行
[mysqld]
skip-host-cache
skip-name-resolve
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp
# 2018.07 新加以下两行
log-bin=mysql-bin
server-id=1
解释下
log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀
server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复
将修改后的文件覆盖Docker中MySQL中的配置文件
[root@localhost ~]# docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/my.cnf
重启MySQL的docker 让之前编辑的配置生效
[root@localhost ~]# docker restart master
master
再次重新连接MySQL,连接成功表示主容器配置成功
运行从容器
[root@localhost ~]# docker run --name slave1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
25d5e75a6083bd59f1b92e2a313b990c59a95a375df3df482ba1c54ab9141748
复制MySQL配置文件
[root@localhost ~]# docker cp slave1:/etc/mysql/my.cnf /usr/local/mysql/slave1/my.cnf
和主容器一样,加入两行
[root@localhost ~]# cd /usr/local/mysql/slave1/
[root@localhost slave1]# vi my.cnf
# 2018.07 新加以下两行
log-bin=mysql-bin
server-id=2
将修改后的文件覆盖Docker中MySQL中的配置文件
[root@localhost ~]# docker cp /usr/local/mysql/slave1/my.cnf slave1:/etc/mysql/my.cnf
重启MySQL的docker 让之前编辑的配置生效
[root@localhost ~]# docker restart slave1
slave1
在SQLyog的slave1中执行
先停止slave io线程
stop slave ;
再执行以下语句
CHANGE MASTER TO
MASTER_HOST='ip',
MASTER_PORT=3306,
MASTER_USER='backup',
MASTER_PASSWORD='backup';
START SLAVE;
解释下
MASTER_HOST 填Navicat连接配置中的ip应该就可以
MASTER_PORT 主容器的端口
MASTER_USER 同步账号的用户名
MASTER_PASSWORD 同步账号的密码
检查是否配置成功
show slave status;
Slave_IO_State 如果是Waiting for master to send event,那么就成功一半了,如果是Connecting to master,基本就是配置失败了,建议重新检查下配置,具体失败的原因可以查看日志追踪
配置失败了则回到CentOS查看日志
docker logs slave1 -f
成功的另外一半则在于Slave_IO_Running与Slave_SQL_Running,如果都是yes,恭喜你,主从复制可以测试起来了
如果有一个不是yes,一般是重启容器后,事务回滚引起的,解决方案如下
在SQLyog中执行
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;
执行后再去看三个关键字的状态,一般是没问题了
至此,主从复制已经搭建完毕