1、首先拉取mysql镜像
docker pull mysql //拉取最新的镜像
docker pull mysql:5.7 //拉取指定版本镜像
2、启动mysql容器
//参数详解
// -d守护进程
// -p端口映射 -p 宿主机端口:容器端口
// --privileged=true 应用容器 获取宿主机root权限
// -v 绑定共享映射目录,-v 宿主机目录:容器目录
//主库
docker run -d -p 3306:3306 --privileged=true
-v ~/docker_data/mysql-master/log:/var/log/mysql
-v ~/docker_data/mysql-master/data:/var/lib/mysql
-v ~/docker_data/mysql-master/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql-master mysql
//从库
docker run -d -p 3307:3306 --privileged=true
-v ~/docker_data/mysql-slave/log:/var/log/mysql
-v ~/docker_data/mysql-slave/data:/var/lib/mysql
-v ~/docker_data/mysql-slave/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql-slave mysql
3、配置my.cnf文件
//**主库配置** 这里在宿主机更新配置文件后,容器也会同步更新
//在刚刚共享映射的宿主机conf目录新建my.cnf 写入以下内容
//我的目录是:/docker_data/mysql-master/conf/my.cnf
[mysqld]
## 设置server_id 同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,stateement,row)
binlog_format=mixed
## 二进制日志过期清理时间 默认值为0 表示不自动清理
expire_logs_days=7
## 跳过主从复制值遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复 1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
//**从库配置** 这里在宿主机更新配置文件后,容器也会同步更新
//在刚刚共享映射的宿主机conf目录新建my.cnf 写入以下内容
//我的目录是:/docker_data/mysql-slave/conf/my.cnf
[mysqld]
## 设置server_id 同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,stateement,row)
binlog_format=mixed
## 二进制日志过期清理时间 默认值为0 表示不自动清理
expire_logs_days=7
## 跳过主从复制值遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复 1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志中
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
4、创建主服务器用户并查询状态
//重启主库容器
docker restart mysql-master
//进入主库容器
docker exec -it mysql-master /bin/bash
//进入容器命令行后进入mysql终端
mysql -uroot -p123456
//新建slave用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
//给slave用户分配权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
//查询主服务器状态
show master status;
5、配置从服务器
//重启从库容器
docker restart mysql-slave
//进入从库容器
docker exec -it mysql-slave /bin/bash
//进入容器命令行后进入mysql终端
mysql -uroot -p123456
//查看从库服务器状态
show slave status \G;
现在这两个状态为No
// slave配置连接master
// master_host 宿主机ip
// master_user 刚刚创建的主库用户
// master_password 刚刚创建的主库用户密码
// master_port 主库端口号
// master_log_file 刚刚在主库通过show master status;查询出来的File名称
// master_log_pos 刚刚在主库通过show master status;查询出来的Position
// master_connect_retry 重连的时间间隔
change master to master_host='192.168.1.10',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mall-mysql-bin.000001',
master_log_pos=1177,
master_connect_retry=30;
//开启主从复制
start slave;
//查询查询从库状态
show slave status \G;
此时就变成Yes了
7、测试
//首先进入到主库创建一个库
create database test;
//进入库
use test;
//创建一个测试表
create table t1(
id int,
name varchar(20));
//新增一条数据
insert into t1 values (1,'test');
//进入从库查询
use test;
select * from t1;
主库写入数据后,从库同步更新过来了