1、下载mysql8的镜像文件
docker pull mysql:8.0.33
创建数据库容器挂载目录:
#主库挂载目录创建
mkdir -p /mydata/mysql8-m1
cd /mydata/mysql8-m1
mkdir log data conf
#从库挂载目录创建
mkdir -p /mydata/mysql8-s1
cd /mydata/mysql8-s1
mkdir log data conf
2、主库配置文件
vim /mydata/mysql8-m1/conf/my.cnf
3、将下面内容拷贝到文件中
# master
[mysqld]
# [必须]服务器唯一ID
server-id=888
# [必须]启用二进制日志
log-bin=mysql-bin
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
# 确保binlog日志写入后与硬盘同步
sync_binlog = 1
# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all
# default
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
保存退出
4、创建主库容器
docker run -p 3308:3306 --restart=always --name mysql8-m1 -v /mydata/mysql8-m1/log:/var/log/mysql -v /mydata/mysql8-m1/data:/var/lib/mysql -v /mydata/mysql8-m1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.33
5、从库配置文件
cat >> mysql/conf/my.cnf <<EOF
# slave
[mysqld]
# [必须]服务器唯一ID
server-id=999
# [必须]启用二进制日志
log-bin=mysql-bin
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
# 确保binlog日志写入后与硬盘同步
sync_binlog = 1
# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all
# relay_log配置中继日志
relay_log=mysql-relay-bin
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
# default
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
EOF
6、创建从库容器
docker run -p 3309:3306 --restart=always --name mysql8-s1 -v /mydata/mysql8-s1/log:/var/log/mysql -v /mydata/mysql8-s1/data:/var/lib/mysql -v /mydata/mysql8-s1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.33
7、在主库容器中配置主从同步账号
#进入主库容器
docker exec -it mysql8-m1 /bin/bash
#连接数据库
mysql -uroot -p123456
# 查看配置的服务ID,显示配置的ID一致
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| server_id | 888 |
| server_id_bits | 32 |
+----------------+-------+
# 看master信息 File 和 Position 从库配置时需要用
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 157 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
# 创建同步账户并开启权限,mysql8中的密码需要指定加密方式
mysql> create user 'slave'@'%' identified with sha256_password by '123456';
mysql> grant replication slave,replication client on *.* to 'slave'@'%';
# 刷新生效
mysql> flush privileges;
提示:如果之前创建账户没有加密,可以将用户名删除重新创建
mysql> delete from user where User='slave';
mysql> commit;
8、在从库容器中配置链接master节点
#进入主库容器
docker exec -it mysql8-s1 /bin/bash
#连接数据库
mysql -uroot -p123456
# 查看配置的服务ID,显示配置的ID一致
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| server_id | 999 |
| server_id_bits | 32 |
+----------------+-------+
# 连接主mysql服务 master_log_file 和 master_log_pos的值要填写主master里查出来的值 注意这里master_host使用的容器ip
mysql> change master to master_host='172.17.0.6',master_user='slave',master_password='123456',master_port=3306,master_log_file='mysql-bin.000003', master_log_pos=157,master_connect_retry=30;
######################################################
### 连接主mysql参数说明:
### master_port:Master的端口号,指的是容器的端口号
### master_user:用于数据同步的用户
### master_password:用于同步的用户的密码
### master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
### master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
### master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
######################################################
# 开启slave
mysql> start slave;
# 查看slave启动状态
mysql> show slave status \G
9、重启主从库容器
docker restart mysql8-m1 mysql8-s1