搭建步骤
1、拉取镜像
Docker pull MySQL:latest
2、查看镜像
docker images
————————————————————————————
mysql latest c8562eaf9d81 5 months ago 546MB
3、创建启动容器
Master
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSword=123456 -d mysql:latest
Slave
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
MySQL 主数据库端口为 3306,容器名称为 mysql-master,默认密码为 123456,-d 为后台运行。
MySQL 从数据库端口为 3307,容器名称为 mysql-slave,默认密码为 123456,-d 为后台运行。
4、配置Master
进入容器:
docker exec -it mysql-master /bin/bash
修改配置文件:
cd /etc/mysql
vim my.cnf
————————————————————————————
bash: vim: command not found
找不到vim命令解决:
# 更新包
apt-get update
# 安装vim
apt-get install vim -y
修改配置文件,添加如下配置:
# 同一局域网内注意要唯一
server-id=1
# 开启二进制日志功能,二进制文件名称
log-bin=master-bin
# 二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog-format=ROW
# 同步的数据库名称,如果不配置,表示同步所有的库
binlog-do-db=数据库名
重启容器:
docker restart mysql-master
5、配置Slave
进入容器:
docker exec -it mysql-slave /bin/bash
修改配置文件如下:
# 同一局域网内注意要唯一
server-id=2
# 开启二进制日志功能,二进制文件名称
log-bin=slave-bin
# 二进制文件的格式
binlog-format=ROW
重启容器:
docker restart mysql-slave
6、开启 Master-Slave 主从复制
进入 master 容器或者通过 MySQL 客户端工具,执行 show master status 查看 master 状态,记录相关信息。
mysql->show master status;
————————————————————————————
-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000007 | 156 | | | |
查看 master 容器的独立IP:
docker inspect --format='{{.NETworkSettings.IPAddress}}' mysql-master
————————————————————————————
172.17.0.4
进入slave容器或者通过MySQL客户端工具,执行如下命令:
change master to master_host='172.17.0.4', master_user='root', master_password='123456', master_port=3306, master_log_file='master-bin.000007', master_log_pos=156, master_connect_retry=60;
- master_host:master的容器独立IP
- master_port:master的容器端口号
- master_user:用于同步数据的用户
- master_password:用于同步数据的用户密码
- master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
- master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
- master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
启动 slave:
start slave
查看 slave 状态:
show slave status G;
————————————————————————————
*************************** 1. row ***************************
Slave_IO_State: WAIting for master to send event
Master_Host: 172.17.0.4
Master_User: root
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: master-bin.000007
Read_Master_Log_Pos: 4187
Relay_Log_File: a40ee670e244-relay-bin.000002
Relay_Log_Pos: 4356
Relay_Master_Log_File: master-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4187
Relay_Log_Space: 4572
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 77e35acb-bfb0-11eb-9513-0242ac110002
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
看到 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 说明启动成功了。
7、关闭主从
进入 slave 容器 mysql 客户端
stop slave;
8、主从测试
通过 MySQL 客户端自主创建数据库表...不展示了...
相关命令语法
拉取镜像
docker pull {镜像名称}:{版本号(默认为latest)}
查看镜像
docker images
创建启动容器
docker run -p {对外暴露端口}:{容器内端口} --name {自定义容器名称} -e {参数} -d {镜像名称}:{版本号}
重启容器
docker restart {容器id或者容器名称}
进入容器
docker exec -it {容器id或者容器名称} /bin/bash
查看容器信息或指定信息
docker inspect {容器id或者容器名称}
docker inspect --format='{{.NetworkSettings.IPAddress}}' {容器id或者容器名称}