1. 程式人生 > >Docker搭建mysql主從

Docker搭建mysql主從

文章目錄

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主機新增一個數據庫,從機重新整理,馬上回同步到從機,驗證成功!
在這裡插入圖片描述