linux和window中使用docker配置mysql主从配置

linux和window中使用docker配置mysql主从配置

如果你的是linux中的docker先安装依赖文件
uname -r
sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
国内阿里云的docker镜像
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新所有的yum源
安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。
紧接着配置一个稳定(stable)的仓库
仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中。

一、首先拉取docker镜像,我们这里使用5.7.24版本的mysql:

docker  image  pull  mysql:5.7.24

如出现下图表示网络没有连接,检查你的网络
在这里插入图片描述
下图表示拉去成功,可能时间会比较慢
在这里插入图片描述


二、启动容器

  • master(主)
docker run -p 3339:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.24

  • slave(从)
docker run -p 3340:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.24

Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。因为我们宿主主机安装了mysql所以docker中mysql容器不在不映射3306端口。但是在docker的mysql容器中我们应该尽量使用mysql默认的3306端口,否则还需要修改mysql的配置也有可能出现无法通过ip连接docker容器内mysql的问题。


参数说明:
语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
通过run命令创建一个新的容器(container)

  • -e, --env=[], 指定环境变量,容器中可以使用该环境变量 这里设置的是mysql的root登录的密码为123456,你也可以进行修改
  • -p, --publish=[], 指定容器暴露的端口 【映射】 这里master我映射的的是3339,从映射到宿主主机上是3340端口。
  • –name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字,起一个名字后期方便找到该容器。
  • -h, --hostname="", 指定容器的主机名
  • -d, --detach=false, 指定容器运行于前台还是后台,默认为false
    运行效果:
    在这里插入图片描述
    在这里插入图片描述
    此时你可以通过docker ps 查看正在运行的容器
    在这里插入图片描述
    此时你可以使用navicat查看你的连接,不连接也行

在这里插入图片描述在这里插入图片描述

三、修改mysql配置文件

1.通过

docker exec -it mysql1  /bin/bash 

2.命令进入到Master容器内部,也可以通过

docker exec -it 容器的id  /bin/bash命令进入。

提示容器id为
在这里插入图片描述
使用 docker ps 即可看见。


3.cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。此时会报出
在这里插入图片描述需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim
在这里插入图片描述
执行

apt-get update

,然后再次执行

apt-get install vim

即可成功安装vim。然后我们就可以使用vim编辑my.cnf,在my.cnf中添加如下配置:
在这里插入图片描述
注意单词拼写问题


4.配置完成之后,需要重启mysql服务使配置生效。使用

service mysql restart
  1. 完成重启。重启mysql服务时会使得docker容器停止,我们还需要
docker start mysql1
  1. 启动容器。
docker  run  -it  mysql1   /bin/bash

7.进入docker容器中的 mysql

mysql  -uroot   -p123456

8.在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
在docker 的mysql1 容器中运行

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

slave 用户名可以自定义 123456 密码可以自己定义

在这里插入图片描述
配置Slave(从)
和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:
在这里插入图片描述
配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。
链接Master(主)和Slave(从)
在Master进入mysql,执行

show master status;

在这里插入图片描述
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
在Slave 中进入 mysql,执行


change master to master_host='172.18.0.2',
 master_user='slave',
 master_password='123456',
 master_port=3306, 
 master_log_file='mysql-bin.000001',
 master_log_pos= 2830, 
 master_connect_retry=30;
  • 注意 更换ip,日志文件名称,日志文件位置
    命令说明:
    master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称|容器id查询容器的ip
    在这里插入图片描述
    master_port:Master的端口号,指的是容器的端口号
    master_user:用于数据同步的用户
    master_password:用于同步的用户的密码
    master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
    master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
    master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
    在Slave 中的mysql终端执行show slave status \G;用 [\G 数列查看]于查看主从同步状态。
    在这里插入图片描述

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;在这里插入图片描述
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
你可以在mysql1的容器中创建数据库,数据表,mysql2中也会同时创建数据库和数据表
php 代码实现读写分离

<?php
//使用docker容器中的mysql数据库 读写分离
/*$sql="insert  into `user` value(null,'李四','123456','1')";*/
/*$sql=" select  *  from  `user`";*/
if(strcasecmp(substr(trim($sql),0,6),'select') == 0){//trim除去字符串两端的空格  substr字符串截取 strcasecmp 比较字符串不区分大小写
    $dbh = new PDO('mysql:host=127.0.0.1;dbname=1704phpA;port=3340', 'root', 'root');
    $dbh->exec("set  names  utf8");
    $stmt= $dbh->query($sql);
   print_r( $stmt->fetchAll(2));
}else{
    $dbh = new PDO('mysql:host=127.0.0.1;dbname=1704phpA;port=3339', 'root', 'root');
    $dbh->exec("set  names  utf8");
   $res= $dbh->exec($sql);
    if($res){
        echo  "ok";
    }
}
?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值