因公司需求,需在Docker環境下配置Mysql主從服務器,但是在網上并沒有找到一篇完整的技術博客。所以自己研究了下,寫一篇博客給大家。此文檔本人原創,轉載請注明作者和出處。
總體步驟:
一 ?搭建Docker環境,下載mysql鏡像,本文以5.7.13為例。
二 ?使用Dockerfile構建自己的鏡像,因為主從服務器的my.cnf不同,所以建議構建兩個鏡像,構建鏡像的同時copy my.cnf文件到鏡像。
三 ?通過build和run構建并運行主從鏡像。
四 ?分別進入主從Mysql容器,修改配置。
五 ?搞完收工。
1下載mysql鏡像源。
使用命令(二選一):
地址一:docker?pull?daocloud.io/library/mysql:5.7.13
地址二:docker?pull?daocloud.io/mysql(測試可用)
鏡像下載好之后,接下來需要使用Dockerfile通過copy my.cnf文件來構建符合自己要求的鏡像。因為主從服務器my.cnf配置略有不同,所以我們選擇構建兩個鏡像,分別命名為mysql-master和mysql-slave。
2使用Dockerfile構建鏡像并創建容器
創建兩個目錄,mkdir master和mkdir slave。然后分別cd到兩個目錄里面使用touch Dockerfile命令創建Dockerfile。將以下內容寫入Dockerfile:
FROM mysql
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
備注:my.cnf文件可以先裝一個mysql的測試版本,然后切換到/etc/mysql目錄下,使用COPY my.cnf /etc/mysql/conf.d/my.cnf到當前目錄,這樣就得到了基礎的配置文件。然后將得到的my.cnf文件分別copy到master和slave目錄下。并做以下修改:
master文件夾下的my.cnf文件
[mysqld]
log-bin=mysql-bin?? //[必須]啟用二進制日志
server-id=1//[必須]服務器唯一ID,默認是1,一般取IP最后一段,這里看情況分配
slave文件夾下的my.cnf文件
[mysqld]
log-bin=mysql-bin?? //[必須]啟用二進制日志
server-id=2//[必須]服務器唯一ID,默認是1,一般取IP最后一段,這里看情況分配
以上已經完成了構建鏡像的準備工作,下面開始正式工作。
切換到master目錄下構建master/mysql鏡像
命令:docker build -t master/mysql .
(命令最后有個.,不要忘記,代表當前目錄)
然后切換到master目錄下構建slave/mysql鏡像
命令:docker build -t slave/mysql .
(命令最后有個.,不要忘記,代表當前目錄)
鏡像構建成功,下一步開始運行。
docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=mysql -d master/mysql
語法:-p 3306是將3306端口映射出來,也可以使用*****:3306指定映射之后的端口,mysql-master為容器的名稱,mysql為指定密碼,master/mysql為鏡像源,下同。
docker run -p 3306 --name slave-master -e MYSQL_ROOT_PASSWORD=mysql -d slave/mysql
從這里開始,建議打開兩個終端窗口,方便操作。
然后分別執行docker exec -it mysql-master bash和docker exec -it slave-master bash命令進入到容器內部。然后分別執行mysql -uroot -p輸入密碼mysql進入到mysql環境,正式配置主從連接服務。
3mysql配置
在主容器mysql中輸入以下命令:
mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'192.168.99.100' IDENTIFIED BY 'mysql';(指定ip)或者
mysql>GRANT REPLICATION SLAVE ON *.* to 'user'@'%' identified by 'mysql';(所有ip)
然后查看主容器數據庫狀態:
命令:mysql>show master status
記錄mysql-bin的值和pos的值。下面要用到,到這里為止,主庫千萬不要再做任何操作,防止狀態改變??梢躁P掉。
然后我們配置一下從庫
命令如下:
mysql>change master to
master_host='192.168.99.100',//要連接的主服務器的ip
master_user='user',//指定的用戶名,最好不要用root
master_log_file='mysql-bin.000003',//主庫記錄的值
master_log_pos=1201,//主庫的pos值
master_port=32771,//主庫3306映射的端口,如果不知道可以使用docker ps查看
master_password='mysql';//當然就是主庫要連接的用戶的密碼了
如果一切順利,那么距離成功還有一步,輸入mysql>start slave啟動從服務器。
最后,檢驗一下我們的成果。
mysql>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222? //主服務器地址
Master_User: mysync ? //授權帳戶名,盡量避免使用root
Master_Port: 3306 ? ?//數據庫端口,部分版本沒有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 ? ? //#同步讀取二進制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes ? ?//此狀態必須YES
Slave_SQL_Running: Yes ? ? //此狀態必須YES
注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)。
以上操作過程,主從服務器配置完成。