dockerfile實(shí)現(xiàn)mysql主從

mysql-master

[root@docker1 dockerfile]# mkdir mysql-master
[root@docker1 dockerfile]# cd mysql-master/
[root@docker1 mysql-master]# pwd
/code/dockerfile/mysql-master

核心邏輯就是拷貝兩個(gè)文件進(jìn)去,然后在容器啟動(dòng)的時(shí)候執(zhí)行 [conf.sh],由 [conf.sh]執(zhí)行另外一個(gè)文件。

Dockerfile

[root@docker1 mysql-master]# vim Dockerfile
From mysql:5.7
MAINTAINER ice ice@163.com

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
COPY conf.sh /mysql/conf.sh
COPY privileges.sql /mysql/privileges.sql

CMD ["sh", "/mysql/conf.sh"]

這里首先設(shè)置允許免密登錄是為了方便后面配置,密碼最后再通過(guò) privileges.sql 來(lái)設(shè)置。

啟動(dòng)腳本conf.sh

[root@docker1 mysql-master]# vim conf.sh
#!/bin/bash

set -e

echo '1. set server_id....'
sed -i '/\[mysqld\]/a server-id=1\nlog-bin=/var/log/mysql/mysql-bin\ngtid-mode=ON\nenforce-gtid-consistency=ON' /etc/mysql/mysql.conf.d/mysqld.cnf

echo '2. start mysql...'
service mysql start

echo '3. setting password...'
sed -i 's/MYSQLROOTPASSWORD/'$MYSQL_ROOT_PASSWORD'/' /mysql/privileges.sql
sed -i 's/MYSQLREPLICATIONUSER/'$MYSQL_REPLICATION_USER'/' /mysql/privileges.sql
sed -i 's/MYSQLREPLICATIONPASSWORD/'$MYSQL_REPLICATION_PASSWORD'/' /mysql/privileges.sql
mysql < /mysql/privileges.sql

echo '4. service mysql status'
echo 'mysql for ice if ready...'

tail -f /dev/null

privileges.sql

這個(gè)文件是對(duì) MySQL 進(jìn)行一些權(quán)限配置,比如設(shè)置用戶(hù)密碼,創(chuàng)建新用戶(hù),數(shù)據(jù)庫(kù)授權(quán)等。
后面兩句很重要

[root@docker1 mysql-master]# vim privileges.sql
use mysql;
set password for root@'localhost' = password("MYSQLROOTPASSWORD");
grant all on *.* to "MYSQLREPLICATIONUSER"@'%' identified by "MYSQLREPLICATIONPASSWORD" with grant option;
flush privileges;

構(gòu)建鏡像:

[root@docker1 mysql-master]# docker build -t ice/mysql-master:2 .
image.png
[root@docker1 mysql-master]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ice/mysql-master    2                   143ff5538304        34 seconds ago      455MB

啟動(dòng)容器測(cè)試配置是否成功

[root@docker1 mysql-master]# docker run  --name icesql -e MYSQL_ROOT_PASSWORD="123456" -e MYSQL_REPLICATION_USER="repl"  -e MYSQL_REPLICATION_PASSWORD="123456"  -d ice/mysql-master:2
835322a4662a55c909a7ab347c1098ef517e321d167408618d9f688ef79d69c5
[root@docker1 mysql-master]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                 NAMES
835322a4662a        ice/mysql-master:2   "docker-entrypoint.s…"   32 seconds ago      Up 31 seconds       3306/tcp, 33060/tcp   icesql

鏈接容器測(cè)試登陸

[root@docker1 mysql-master]# docker exec -it icesql bash
root@835322a4662a:/# mysql -uroot -p123456
image.png

查看權(quán)限:

mysql> select * from mysql.user where user='repl'\G

image.png

成功創(chuàng)建mysql-master鏡像

mysql-slave

[root@docker1 dockerfile]# mkdir mysql-slave
[root@docker1 dockerfile]# cd mysql-slave/
[root@docker1 mysql-slave]# pwd
/code/dockerfile/mysql-slave

Dockerfile

[root@docker1 mysql-slave]# vim Dockerfile
From mysql:5.7
MAINTAINER ice ice@163.com

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
COPY conf.sh /mysql/conf.sh
COPY privileges.sql /mysql/privileges.sql

CMD ["sh", "/mysql/conf.sh"]

啟動(dòng)腳本conf.sh

[root@docker1 mysql-slave]# vim conf.sh
#!/bin/bash

set -e

echo '1. set server_id...'
RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})"
sed -i '/\[mysqld\]/a server-id='$RAND'\nlog-bin=/var/log/mysql/mysql-bin\ngtid-mode=ON\nenforce-gtid-consistency=ON' /etc/mysql/mysql.conf.d/mysqld.cnf

echo '2. start mysql...'
service mysql start

echo '3. setting password...'
sed -i 's/MYSQLROOTPASSWORD/'$MYSQL_ROOT_PASSWORD'/' /mysql/privileges.sql
sed -i 's/MYSQLMASTERSERVICEHOST/'$MYSQL_MASTER_SERVICE_HOST'/' /mysql/privileges.sql
sed -i 's/MYSQLREPLICATIONUSER/'$MYSQL_REPLICATION_USER'/' /mysql/privileges.sql
sed -i 's/MYSQLREPLICATIONPASSWORD/'$MYSQL_REPLICATION_PASSWORD'/' /mysql/privileges.sql

mysql < /mysql/privileges.sql

echo '4. service mysql status'
echo 'mysql for tigerfive if ready...'

tail -f /dev/null

privileges.sql

[root@docker1 mysql-slave]# vim privileges.sql
use mysql;
set password for root@'localhost' = password('MYSQLROOTPASSWORD');
flush privileges;
CHANGE MASTER TO master_host='MYSQLMASTERSERVICEHOST', master_user='MYSQLREPLICATIONUSER', master_password='MYSQLREPLICATIONPASSWORD' ;
START SLAVE;

制作鏡像

[root@docker1 mysql-slave]# docker build -t ice/mysql-slave:2 .

image.png

查看mysql-master的容器IP

[root@docker1 ~]# docker inspect icesql |grep IPAddr
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

啟動(dòng)從庫(kù)

[root@docker1 ~]# docker run  --name icesql2 -e MYSQL_ROOT_PASSWORD="123456" -e MYSQL_MASTER_SERVICE_HOST="172.17.0.2" -e MYSQL_REPLICATION_USER='repl' -e MYSQL_REPLICATION_PASSWORD="123456" -d ice/mysql-slave:2

查看從庫(kù)IO進(jìn)程

[root@docker1 ~]# docker exec -it icesql2 bash
root@0ca351a3f2d1:/# mysql -uroot -p123456
mysql> show slave status\G
image.png

測(cè)試主從

登錄主庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)

[root@docker1 ~]# docker exec -it icesql bash
root@835322a4662a:/# mysql -uroot -p123456
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
image.png

查看從庫(kù)是否有test1

mysql> show databases;

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容