前面方式太过于麻烦,每次都需要进入容器去修改my.cnf文件,现在我们准备优化下流程。思路是将本地my.cnf文件拷贝到容器中去,这样就方便多了。
先看看整体目录结构:

接下来看看master、slave1、slave2文件夹下的配置

其中3个文件夹下的Dockerfile文件内容都一样
from mysql:8COPY ./my.cnf /etc/mysql/
基于mysql:8基础镜像,并将当前目录下my.cnf文件拷贝到容器/etc/mysql/目录下
接下来看看master的my.cnf文件
[mysqld]pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysqlsecure-file-priv= NULL# Custom config should go here!includedir /etc/mysql/conf.d/log-bin=mysql-binserver-id=1
其它slave1和slave2的my.cnf文件一样,只有server-id不一样就,分别是2和3
最后来看看根目录下的 docker-compose.yml
version: '3'services:master:build: ./master/ports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.2slave1:build: ./slave1/ports:- "3307:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.3slave2:build: ./slave2/ports:- "3308:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.4networks:mysql_network:ipam:config:- subnet: 172.20.0.0/16getway: 172.20.0.1
这样就可以在根目录下运行cmd,在执行
docker-compose up -d
此时容器就部署好了,通过docker-desk可以看到,容器已经运行了
最后主从配置和之前的一样
1) master创建slave账号查看binlog
create user 'slave'@'172.20.0.%' identified with mysql_native_password by '123456';grant replication slave on *.* to 'slave'@'172.20.0.%';flush privileges;show master status;
2) 从节点配置主从配置
CHANGE MASTER TOMASTER_HOST='172.20.0.2',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=853;start slave;show slave status;
最后进行验证方式和上一篇介绍的是一致的。
优化:当删除容器的时候docker中的数据就没了,所以需要将docker中的数据存放到宿主机上,只需要修改docker-compose.yml文件就可以了
在每个节点我们添加volumes
version: '3'services:master:build: ./master/ports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.2volumes:- "./master/data:/var/lib/mysql"slave1:build: ./slave1/ports:- "3307:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.3volumes:- "./slave1/data:/var/lib/mysql"slave2:build: ./slave2/ports:- "3308:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.4volumes:- "./slave2/data:/var/lib/mysql"networks:mysql_network:ipam:config:- subnet: 172.20.0.0/16getway: 172.20.0.1
这样即使容器删除了,下次重新创建的容器也会保留之前的数据
