docker下实现两个(或多个)mysql容器的主、从数据库同步配置,首先要明白docker容器的相互通信关系,默认是使用的bridge模式:
也就是说,通过docker run命令创建docker容器是每个容器都有自己单独的内部地址的(例如: 172.17.0.2),而且,在容器内部运行的时候是可以相互访问的(例如:通过docker exec ... bash 命令运行之后,可以在linux命令下登录到mysql之后,直接连上另外一个mysql容器,地址是另外一个mysql容器的内部地址,例如: 172.17.0.3)。切记! 运行需要访问对方容器的命令时,只能在容器内部操作!
首先,通过docker的run命令安装mysql容器:
docker run -d -p 3307:3306 --name my-mysql-1 -e MYSQL_ROOT_PASSWORD=654321 mysql:5.7.18 #master主库
docker run -d -p 3308:3306 --name my-mysql-2 -e MYSQL_ROOT_PASSWORD=654321 mysql:5.7.18 #slave从库
在docker下实现两个mysql容器的主从配置,主要分为四个步骤:
1.配置master主库,在/etc/mysql# cd mysql.conf.d/mysqld.cnf 添加:
server-id = 1
log-bin= mysql-bin
read-only=0
2.在master主库创建同步数据用户,分配REPLICATION SLAVE 权限,使用flush privileges刷新:
CREATE USER 'slave'@ '%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';
flush privileges;
3.配置slave从库,在/etc/mysql# cd mysql.conf.d/mysqld.cnf 添加:
server-id = 2
log-bin= mysql-bin
read-only=1
4.设置master主库连接:
change master to master_host='172.17.0.3',master_user='slave',master_password='123456',master_log_file='mysql- bin.000003',master_log_pos=153,master_port=3306; #该命令在容器内部运行:docker exec ... bash --> cd /etc/init.d --> mysql -uroot -p 登录到mysql 然后执行上面代码。
master_log_file为master主库中 show master status; 命令查询出来的 File 值。
切记!master_log_pos 该参数值最好使用 master主库中 show master status; 命令查询出来的 Position 值,否则可能会 Slave_SQL_Running为No,该值应该为数据同步的索引位置。
#如果报错:ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first. 需要先把之前运行的slave停掉:stop slave; 等运行完 change master命令之后再运行: start slave;
最后,在master主库执行:
create database test;
use test;
create table student(id int primary key auto_increment,name varchar(50), age int, create_time datetime);
insert into student values(id,'sdfs',12,CURRENT_DATE);
就可以看到slave从库中也创建了该数据库、表以及刚插入的数据!
参考: