基于Docker的MySQL主从数据库搭建

master主数据库

新增mysql配置文件mysql-master.cnf

[mysqld]
log-bin=mysql-bin
server-id=161

注:server-id一般为ip最后一段

编写Dockerfile

FROM mysql:latest
MAINTAINER Raphael Zhang
COPY mysql-master.cnf /etc/mysql/conf.d/
EXPOSE 3306
CMD ["mysqld"]

docker.io的mysql镜像配置文件结构与nginx类似,通过以上脚本导入配置即可。

构建docker镜像

docker build -t mysql-master:latest .

创建容器

docker run --name mysql-master -p 3306:3306 -v $HOME/mysql/conf.d:/etc/mysql/conf.d -v $HOME/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD={your passwd} -d mysql-master:latest

登陆到主数据库容器,查看master状态

docker exec -it mysql-master bash

image

主数据库创建用户

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'mysql_master';

slave从数据库

创建方式与master方式类似

新增mysql配置文件mysql-slave.cnf

[mysqld]
log-bin=mysql-bin
server-id=163

注:server-id一般为ip最后一段

编写Dockerfile

FROM mysql:latest
MAINTAINER Raphael Zhang
COPY mysql-slave.cnf /etc/mysql/conf.d/
EXPOSE 3306
CMD ["mysqld"]

镜像构建过程类似,不再赘述

登陆从数据库,设置相关参数

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
change master to master_host='172.31.196.161',master_user='backup',master_password='mysql_master',master_log_file='mysql-bin.000002',master_log_pos=439;

master_host为docker的地址不能写127.0.0.1
master_user是在主库创建的用户
master_log_pos是主库show master status;查询出的Position

启动服务

start slave;

查看服务状态

show slave status;

显示

Waiting for master to send event

即是成功了。