Docker启动MySQL主、从
创建相关目录
mkdir -p ~/docker-mysql/master/{conf,logs,data}
mkdir -p ~/docker-mysql/slave/{conf,logs,data}
conf 配置文件
logs 日志文件
data 数据文件
启动主库
docker run --name master --restart=always -d -p 3306:3306 -v ~/docker-mysql/master/conf:/etc/mysql/conf.d -v ~/docker-mysql/master/logs:/logs -v ~/docker-mysql/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.31
启动从库
docker run --name slave --restart=always --link master:master-db -d -p 3307:3306 -v ~/docker-mysql/slave/conf:/etc/mysql/conf.d -v ~/docker-mysql/slave/logs:/logs -v ~/docker-mysql/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.31
--link master:master-db
link到主库容器,这样从库可以使用master-db域名对主库进行访问解决宿主机IP更换导致从库无法访问主库问题。
MySQL主从配置
主库配置
增加MySQL配置文件开启binlog
vi ~/docker-mysql/master/conf/my.cnf
增加配置
[mysqld]
server-id=1
log-bin=mysql-bin
配置说明
说明server-id设置主服务器的ID(不能和别的服务器重复,建议使用ip的最后一段)log-binbinlog日志文件名
重启docker使配置文件生效
docker restart master
增加从库同步账号
docker exec -it master mysql -uroot -proot
进入后执行下面命令增加用户并赋予同步权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave';
查看主库状态
mysql> show master status;+------------------+----------+--------------+-------------------------------------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+-------------------------------------------------+-------------------+| mysql-bin.000001 | 154 | | mysql,information_schema,performance_schema,sys | |+------------------+----------+--------------+-------------------------------------------------+-------------------+1 row in set (0.00 sec)mysql>
从库配置
增加MySQL配置文件开启binlog
vi ~/docker-mysql/slave/conf/my.cnf
增加配置
[mysqld]
server-id=2
log-bin=mysql-bin
重启docker使配置文件生效
docker restart slave
启动主从同步
docker exec -it slave mysql -uroot -proot
stop slave;
change master to master_host='master-db', master_user='slave' ,master_password='slave', master_log_file='mysql-bin.000001' ,master_log_pos=154;
start slave;
mysql> stop slave;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> change master to master_host='master-db', master_user='slave' ,master_password='slave', master_log_file='mysql-bin.000001' ,master_log_pos=154;Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)mysql> show slave status G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: master-db Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: business-mysql-slave-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: mysql,information_schema,performance_schema,sys
尾巴
以上部署方式可以在开发环境快速搭建出MySQL主从环境,生产环境中多机集群部署的时候可以使用swarm或者k8s使用overlay网络等解决从库容器到主库容器的的互通问题。