搭建步驟
1、拉取鏡像
Docker pull MySQL:latest
2、查看鏡像
docker images
————————————————————————————
mysql latest c8562eaf9d81 5 months ago 546MB
3、創(chuàng)建啟動容器
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指的是把改變的內容復制過去,而不是把命令在從服務器上執(zhí)行一遍,statement指的是在主服務器上執(zhí)行的SQL語句,在從服務器上執(zhí)行同樣的語句。MySQL默認采用基于語句的復制,效率比較高。mixed指的是默認采用基于語句的復制,一旦發(fā)現(xiàn)基于語句的無法精確的復制時,就會采用基于行的復制。
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 客戶端工具,執(zhí)行 show master status 查看 master 狀態(tài),記錄相關信息。
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客戶端工具,執(zhí)行如下命令:
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 狀態(tài):
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 客戶端自主創(chuàng)建數據庫表...不展示了...
相關命令語法
拉取鏡像
docker pull {鏡像名稱}:{版本號(默認為latest)}
查看鏡像
docker images
創(chuàng)建啟動容器
docker run -p {對外暴露端口}:{容器內端口} --name {自定義容器名稱} -e {參數} -d {鏡像名稱}:{版本號}
重啟容器
docker restart {容器id或者容器名稱}
進入容器
docker exec -it {容器id或者容器名稱} /bin/bash
查看容器信息或指定信息
docker inspect {容器id或者容器名稱}
docker inspect --format='{{.NetworkSettings.IPAddress}}' {容器id或者容器名稱}