搭建步驟
1、拉取鏡像
Docker pull MySQL:latest
2、查看鏡像
docker images
————————————————————————————
mysql latest c8562eaf9d81 5 months ago 546MB
3、創(chuàng)建啟動(dò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 主數(shù)據(jù)庫端口為 3306,容器名稱為 mysql-master,默認(rèn)密碼為 123456,-d 為后臺(tái)運(yùn)行。
MySQL 從數(shù)據(jù)庫端口為 3307,容器名稱為 mysql-slave,默認(rèn)密碼為 123456,-d 為后臺(tái)運(yùn)行。
4、配置Master
進(jìn)入容器:
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
修改配置文件,添加如下配置:
# 同一局域網(wǎng)內(nèi)注意要唯一
server-id=1
# 開啟二進(jìn)制日志功能,二進(jìn)制文件名稱
log-bin=master-bin
# 二進(jìn)制日志格式,有row、statement、mixed三種格式,row指的是把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)行一遍,statement指的是在主服務(wù)器上執(zhí)行的SQL語句,在從服務(wù)器上執(zhí)行同樣的語句。MySQL默認(rèn)采用基于語句的復(fù)制,效率比較高。mixed指的是默認(rèn)采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句的無法精確的復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。
binlog-format=ROW
# 同步的數(shù)據(jù)庫名稱,如果不配置,表示同步所有的庫
binlog-do-db=數(shù)據(jù)庫名
重啟容器:
docker restart mysql-master
5、配置Slave
進(jìn)入容器:
docker exec -it mysql-slave /bin/bash
修改配置文件如下:
# 同一局域網(wǎng)內(nèi)注意要唯一
server-id=2
# 開啟二進(jìn)制日志功能,二進(jìn)制文件名稱
log-bin=slave-bin
# 二進(jìn)制文件的格式
binlog-format=ROW
重啟容器:
docker restart mysql-slave
6、開啟 Master-Slave 主從復(fù)制
進(jìn)入 master 容器或者通過 MySQL 客戶端工具,執(zhí)行 show master status 查看 master 狀態(tài),記錄相關(guān)信息。
mysql->show master status;
————————————————————————————
-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000007 | 156 | | | |
查看 master 容器的獨(dú)立IP:
docker inspect --format='{{.NETworkSettings.IPAddress}}' mysql-master
————————————————————————————
172.17.0.4
進(jìn)入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的容器獨(dú)立IP
- master_port:master的容器端口號(hào)
- master_user:用于同步數(shù)據(jù)的用戶
- master_password:用于同步數(shù)據(jù)的用戶密碼
- master_log_file:指定 Slave 從哪個(gè)日志文件開始復(fù)制數(shù)據(jù),即上文中提到的 File 字段的值
- master_log_pos:從哪個(gè) Position 開始讀,即上文中提到的 Position 字段的值
- master_connect_retry:如果連接失敗,重試的時(shí)間間隔,單位是秒,默認(rèn)是60秒
啟動(dòng) 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 說明啟動(dòng)成功了。
7、關(guān)閉主從
進(jìn)入 slave 容器 mysql 客戶端
stop slave;
8、主從測試
通過 MySQL 客戶端自主創(chuàng)建數(shù)據(jù)庫表...不展示了...
相關(guān)命令語法
拉取鏡像
docker pull {鏡像名稱}:{版本號(hào)(默認(rèn)為latest)}
查看鏡像
docker images
創(chuàng)建啟動(dòng)容器
docker run -p {對(duì)外暴露端口}:{容器內(nèi)端口} --name {自定義容器名稱} -e {參數(shù)} -d {鏡像名稱}:{版本號(hào)}
重啟容器
docker restart {容器id或者容器名稱}
進(jìn)入容器
docker exec -it {容器id或者容器名稱} /bin/bash
查看容器信息或指定信息
docker inspect {容器id或者容器名稱}
docker inspect --format='{{.NetworkSettings.IPAddress}}' {容器id或者容器名稱}






