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