1.MYSQL配置环境准备
1.1 启动基础镜像
选用mysql5.7镜像
docker pull mysql:5.7
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1.2 复制配置文件及数据库
确认配置文件位置,确定本地文件位置,将master和slave的配置文件及数据库放置在不同路径下
登录容器,确认相关文件位置
docker exec -it mysql /bin/bash
ps:退出容器的命令:ctrl+p+q
在宿主机上,拷贝对应文件
sudo docker cp mysql:/etc/mysql /etc/mysql/master/mysql5.7
sudo docker cp mysql:/etc/mysql /etc/mysql/slave/mysql5.7
sudo docker cp mysql:/var/lib/mysql /var/lib/mysql/master/mysql5.7
sudo docker cp mysql:/var/lib/mysql /var/lib/mysql/slave/mysql5.7
重点:删除slave的数据文件中的auto.conf,否则,两个服务器的uuid会相同,造成后面start slave启动失败
1.3 测试
docker run --name mysql_master -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/master/mysql5.7:/etc/mysql -v /var/lib/mysql/master/mysql5.7:/var/lib/mysql -d mysql:5.7
docker run --name mysql_slave -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/slave/mysql5.7:/etc/mysql -v /var/lib/mysql/slave/mysql5.7:/var/lib/mysql -d mysql:5.7
docker ps -a
都是up状态,表示运行正常
2.配置mysql主从
2.1确定各个容器的ip地址
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
还可以分别连接到各个容器,查看/etc/hosts文件
本例中
/mysql_slave 172.17.0.4 map[]
/mysql_master 172.17.0.3 map[]
/mysql 172.17.0.2 map[]
2.2 配置主从
2.2.1 下载并启动一个phpmyadmin镜像
docker pull phpmyadmin:phpmyadmin
docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest
访问http://服务器ip:10080,测试phpmyadmin是否正常
也可使用其他mysql管理端
2.2.2 配置主服务器
2.2.2.1修改配置文件
sudo vi /etc/mysql/master/mysql5.7/mysql.conf.d/mysqld.conf
添加如下内容:
## 让数据库开放监听
bind-address = 0.0.0.0
## master mysql-server
log-bin = mysql-bin
server-id = 1
## 忽略库(此处根据需要填写)
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = preformance_schema
## 制定复制的库,修改下面一行的内容
replicate-do-db
2.2.2.2 在主数据库服务器添加slave账户,
登入phpmyadmin
http://主机:10080/
添加账户:
例如添加’slave’账户,赋权’REPLICATION SLAVE’,访问地址%,密码设定’123456’。
2.2.2.3 记录关键数据
查看服务器状态,记录下:
File,Position两个数值
2.2.3 配置从服务器
2.2.3.1 修改配置文件
sudo vi /etc/mysql/master/mysql5.7/mysql.conf.d/mysqld.conf
添加如下内容:
## 让数据库开放监听
bind-address = 0.0.0.0
## slave mysql-server
log-bin = mysql-bin
server-id = 2 ## 此处切记不要和主服务器重复
## 忽略库(此处根据需要填写)
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = preformance_schema
2.2.3.2 在从数据库设置master
登入从数据库的phpmyadmin
执行:
change master to master_host='172.17.0.3',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306;
其中:
master_host就是主服务器的docker ip地址
master_log_file就是在master服务器查询到的日志名
master_log_pos就是在master服务器查询到的position值
执行:
start slave;
查看服务器状态:
show slave status;
Slave_IO_Running Yes
Slave_SQL_Running Yes
以上两项均为’yes’,则slave正常启动
有错误时,需开启slave服务器的mysqld.conf中的error.log,进行查看,定位错误。
以上为在单一宿主机,使用docker完成主从配置的过程。
遗留问题,当没有指定服务器IP时,重启容器,容器的IP会变化,导致主从不可用
解决方案,固化容器IP地址
固化方法
在容器中添加一个网络,下例,添加一个名为mysql的网络,网段是172.18.0.0/16
docker network create --subnet=172.18.0.0/16 mysql
启动容器时,指定IP即可
docker run --name mysql_slave --net mysql --ip 172.18.0.3 -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/slave/mysql5.7:/etc/mysql -v /var/lib/mysql/slave/mysql5.7:/var/lib/mysql -d mysql:5.7
