基于Docker简单搭建MySQL主从复制

一、安装docker

## 安装docker
yum install docker
##一路y下去

1、启动docker

## 启动方式一
sudo systemctl start docker
## 启动方式二
service docker start

2、查看docker版本

[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

出现版本信息表示安装成功

3、设置docker开机自启动

systemctl  enable docker.service

二、安装MySQL

1、使用docker拉取MySQL镜像

[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

2、运行主容器

[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版本

3、检查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

4、开放3306端口

## --permanent 永久开启
[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success

5、测试连接

基于Docker简单搭建MySQL主从复制_第1张图片
连接成功

6、创建主容器的复制帐号

## 在MySQL中执行以下语句
grant replication slave on *.* to 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';

基于Docker简单搭建MySQL主从复制_第2张图片

出现如图所示结果表示授权成功

7、修改MySQL配置环境

回到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-binlog文件名的前缀
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

再次重新连接MySQL,连接成功表示主容器配置成功
基于Docker简单搭建MySQL主从复制_第3张图片

在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;

基于Docker简单搭建MySQL主从复制_第4张图片
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 ;

执行后再去看三个关键字的状态,一般是没问题了
至此,主从复制已经搭建完毕

五、测试

在master创建一个数据库

基于Docker简单搭建MySQL主从复制_第5张图片

再去slave1刷新下查看

基于Docker简单搭建MySQL主从复制_第6张图片

在master中的test数据库再建一张表并添加几条数据

基于Docker简单搭建MySQL主从复制_第7张图片

再去slave1刷新下查看

基于Docker简单搭建MySQL主从复制_第8张图片

END

借鉴了作者的博文

你可能感兴趣的:(Docker)