Docker搭建mysql主從
阿新 • • 發佈:2018-11-01
文章目錄
Dockerfile製作mysql主從映象
如果使用我本人制作好的mysql主從映象,則請忽略這個步驟,直接調到下一步"搭建mysql主從"。若想自己製作mysql主從映象,則
mysql-master映象製作
Dockerfile檔案內容如下:
FROM mysql:5.7
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
my.cnf檔案內容如下:
[mysqld]
##################基礎設定##################
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
#Mysql服務的唯一編號 每個mysql服務Id需唯一
server-id=1
#資料庫預設字符集,主流字符集支援一些特殊表情符號(特殊表情符佔用4個位元組)
character-set-server = utf8mb4
#資料庫字符集對應一些排序等規則,注意要和character-set-server對應
collation-server = utf8mb4_general_ci
#設定client連線mysql時的字符集,防止亂碼
init_connect=‘SET NAMES utf8mb4‘
#是否對sql語句大小寫敏感,1表示不敏感
lower_case_table_names = 1
##################主從複製設定##################
#開啟mysql binlog功能
log-bin=/var/log/mysql/mysql-bin.index
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
將Dockerfile和my.cnf放在同一目錄下,然後執行:
docker build -t mysql-master:5.7 .
mysql-slave映象製作
Dockerfile檔案內容如下:
FROM mysql:5.7
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
my.cnf檔案內容如下:
[mysqld]
##################基礎設定##################
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
#Mysql服務的唯一編號 每個mysql服務Id需唯一
server-id=2
#資料庫預設字符集,主流字符集支援一些特殊表情符號(特殊表情符佔用4個位元組)
character-set-server = utf8mb4
#資料庫字符集對應一些排序等規則,注意要和character-set-server對應
collation-server = utf8mb4_general_ci
#設定client連線mysql時的字符集,防止亂碼
init_connect=‘SET NAMES utf8mb4‘
#是否對sql語句大小寫敏感,1表示不敏感
lower_case_table_names = 1
##################主從複製設定##################
#開啟mysql binlog功能
log-bin=/var/log/mysql/mysql-bin.index
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
將Dockerfile和my.cnf放在同一目錄下,然後執行:
docker build -t mysql-master:5.7 .
檢視製作好的兩個映象:
製作好的兩個映象可以上傳到docker hub公共倉庫,方便以後搭建mysql主從,直接從倉庫下載這兩個映象。推送映象到公共倉庫請參考我寫的另一篇文章:Docker第五篇-Docker映象推送公共倉庫
搭建mysql主從
獲取映象
可以使用上面建立的兩個映象,這裡我使用我自己倉庫上面的映象(因為我已經把上面製作好的映象上傳到我個人倉庫)
docker pull dalomao/mysql-master:5.7
docker pull dalomao/mysql-slave:5.7
宿主機建立目錄用來掛載
宿主機建立兩個目錄,用來分別掛載主從容器中的資料,這樣子將主從的資料掛載到宿主機,可以防止容器被意外刪除或宕機是,資料在宿主機仍有備份(日誌無需掛載)
mkdir -p /home/mysql/master-data
mkdir -p /home/mysql/slave-data
啟動主從mysql容器
#啟動mysql-master
docker run \
--name mysql-master \
--privileged=true \
-v /home/mysql/master-data:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-d dalomao/mysql-master:5.7
#啟動mysql-slave
docker run \
--name mysql-slave \
--privileged=true \
-v /home/mysql/slave-data:/var/lib/mysql \
-p 3307:3306 --link mysql-master:master \
-e MYSQL_ROOT_PASSWORD=root \
-d dalomao/mysql-slave:5.7
- privileged=true表示容器內的root使用者擁有真正的root許可權,這樣可以在容器內看到宿主機的裝置,並且執行mount,設定可以在容器內啟動docker容器
- -v /home/mysql/slave-data:/var/lib/mysql表示將容器內的資料目錄/var/lib/mysql掛載到宿主機/home/mysql/slave-data目錄下
- -p 3307:3306表示宿主機埠3307對映容器內埠3306
- -e MYSQL_ROOT_PASSWORD=root表示設定容器中的mysql的root使用者的密碼
- 該映象是我自己製作的映象,已經包含內建的my.cnf配置。如果想重新覆蓋內建的my.cnf配置,可以將該配置放在宿主機某個目錄,然後使用以下命令進行覆蓋:-v /home/mysql/etc/master:/etc/mysql/conf.d。其中/home/mysql/etc/master是宿主機目錄,該目錄下有.cnf結尾的配置檔案,
/etc/mysql/conf.d是固定寫法- 很多映象,包括mysql映象,它們的啟動命令及配置如何覆蓋等等,在docker hub倉庫中都有說明的,因此在碰到不清楚的,一定記得看官方資料!!!
登入master容器授權
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
grant replication slave on *.* to 'test'@'%' identified by '123456';
flush privileges;
這裡是直接授權*,如果指定IP授權的話,需要退出容器使用以下命令檢視雙方的IP:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
緊接著繼續在master容器檢視主機狀態:
show master status;
這裡一定要記住File和Position的值,等會在配置從機的時候會用到
登入slave容器並啟動
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
change master to master_host='master', master_user='test', master_password='123456', \
master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=589, master_connect_retry=30;
start slave;
// 檢視從的狀態
show slave status\G
- master_log_file就是之前我們檢視master主機的File
- master_log_pos就是之前我們檢視master主機的Position
驗證
在Navicat主機新增一個數據庫,從機重新整理,馬上回同步到從機,驗證成功!