docker搭建mysql主从复制模式
1、启动master容器
docker run -d -p 3306:3306 --privileged=true -v /data/myMaster/log:/var/log/mysql -v /data/myMaster/data:/var/lib/mysql -v /data/myMaster/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --name myMaster mysql:5.7.40 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
2、查看
docker ps
这时发现并没有启动,查看docker启动日志
docker logs 容器名
提示如下错误
2022-11-02 09:21:18+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.40-1.el7 started.
2022-11-02 09:21:18+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.YwKPoxWb8z
mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory)
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
意思是不存在这个文件或目录
因为mysql容器的/etc/mysql目录挂载到宿主机的/data/myMaster/conf目录,由于宿主机的 /data/myMaster/conf是空的,所以找不到/etc/mysql/conf.d中conf.d这个目录,导致容器创建失败。
怎么办?
随便启动一个docker mysql,然后将mysql容器中的文件拷贝到宿主机中即可
docker cp 3d2f998819f2:/etc/mysql/conf.d /data/myMaster/conf/
docker cp 3d2f998819f2:/etc/mysql/mysql.conf.d /data/myMaster/conf/
注意:3d2f998819f2是随意启动的新的mysql容器;
然后在启动myMaster 容器
docker restart myMaster
这时,就可以启动成功了
3、在/data/myMaster/conf/增加mysql配置文件my.cnf,内容如下:
[mysqld]
server_id=1
log-bin=mall-mysql-bin
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
然后再执行myMaster容器重启,这时,容器启动,
4、进入myMaster容器
docker exec -it myMaster bash #进入myMaster容器
mysql -uroot -p #登陆mysql
create user 'slave'@'%' identified by '123456'; #创建用户密码
grant replication slave,replication client on *.* to 'slave'@'%'; #给用户赋权限
show master status #查看master的状态

5、启动mySlave容器
docker run -d -p 3307:3306 --privileged=true -v /data/mySlave/log:/var/log/mysql -v /data/mySlave/data:/var/lib/mysql -v /data/mySlave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --name mySlave mysql:5.7.40 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
6、在/data/mySlave/conf下创建my.cnf文件,内容如下
[mysqld]
server_id=2
binlog-ignore-db=mysql
log-bin=mall-mysql-slave1-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mall-mysql-relay-bin
log_slave_updates=1
read_only=1
7、进入mySlave容器的mysql客户端
docker exec -it mySlave bash #进入myMaster容器
mysql -uroot -p #登陆mysql
change master to master_host='192.168.236.130',master_user='slave',master_password='123456',master_port=3306,master_log_file='mall-mysql-bin.000006',master_log_pos=617,master_connect_retry=30; #在从mysql上配置主从复制
8、开启主从复制
start slave; #开启从mysql
show slave status \G; #查看主从同步状态

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
表示开始主从同步
9、实验
在主mysql这个建表,增加数据,在从服务器上也可以查看到,此时就成功了
10、my.cnf简介
#
[mysqld]
#设置server_id,同一局域网需要唯一
server_id=2
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用二进制的格式
binlog_format=mixed
#二进制日志过期清理时间,默认为0,表示不清理
expire_logs_days=7
#跳过主从复制时遇到的所有错误或指定类型的错误,避免slave端复制中断;如1062指主键重复,1032指主从数据库不一致
slave_skip_errors=1062
#relay_log配置中继日志
relay_log=mall-mysql-relay-bin
#表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#slave设置为只读(具有super权限的用户除外)
read_only=1
11、mysql主从命令解析
master_host:主数据库的IP地址;
master_port:主数据库的运行端口
master_user:在主数据库创建的用于同步数据的用户账号
master_password:在主数据库创建的用于同步数据的用户密码
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_connect_retry:连接失败重试的时间间隔,单位是秒