# docker搭建主从数据库及读写分离

### 1、安装准备

#### 1.1、读写分离账号 <a href="#t2" id="t2"></a>

搭建mysql主从数据库(使用docker镜像分别在两台服务器上搭建数据库）\
主服务器ip：172.16.0.6\
从服务器ip：172.16.0.7

**拉取docker5.7**

```docker
docker pull mysql:5.7
```

**自定义配置**

**修改master节点配置文件** 进入/home/mysql/conf.d目录，添加my.cnf文件，增加如下内容

```bash
mkdir -p /home/mysql/conf.d && vim /home/mysql/conf.d/my.cnf
[mysqld]
server-id=1
log-bin=master-bin
```

**修改slave节点配置文件** 进入/home/mysql/conf.d目录，添加my.cnf文件，增加如下内容<br>

```bash
mkdir -p /home/mysql/conf.d && vim /home/mysql/conf.d/my.cnf
[mysqld]
server-id=2
log-bin=slave-bin
read_only=1

```

**运行镜像**

```bash
docker run \
--privileged=true \
--name mysql \
-p 3306:3306 \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=ok5nnbwzfe653c39 \
-d mysql:5.7
```

-–privileged：权限\
-–name：容器名 \
–p：映射宿主主机端口 \
-v：挂载宿主目录到容器目录 \
-e：设置环境变量，此处指定root密码 \
-d：后台运行容器 <br>

![](/files/PBs2TEQQGZGI1ZtkjG0Z)

**进入容器内** 172.16.0.6

```bash
docker exec -it $(docker ps -q) bash
```

**登录** 172.16.0.6

```bash
mysql -uroot -pok5nnbwzfe653c39
#查看bin-log开启状态，如果是ON，表示bin-log配置已生效
show variables like 'log_bin';
#查看master状态
SHOW MASTER STATUS; 
#重置bin-log
reset master; 
#输入mysql查询语句
select host,user,plugin,authentication_string from mysql.user;
#放行访问
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ok5nnbwzfe653c39';
```

![如果上图的plugin不是mysql\_native\_password可能会导致外网访问不了](/files/XC8Wf6Q2fzjTvoOXZRjD)

**添加账号**

**配置master账号**  172.16.0.6

```bash
#创建了一个用户名为slave密码为ok5nnbwzfe653c39的用户。
create user 'slave'@'%' identified by'ok5nnbwzfe653c39';
flush privileges;
grant replication slave, replication client on *.* to 'slave'@'%' identified by'ok5nnbwzfe653c39';
SHOW MASTER STATUS;
```

**配置slave账号** 172.16.0.7

```bash
#slave连接master
mysql -uroot -pok5nnbwzfe653c39
CHANGE MASTER TO MASTER_HOST='172.16.0.6', 
MASTER_USER='slave',
MASTER_PASSWORD='ok5nnbwzfe653c39',
MASTER_LOG_FILE='master-bin.000001',          
MASTER_LOG_POS=154;                          
#开启slave
start slave;
#查看slave状态
show slave status\G
#能查看到这两个为yes则成功
#Slave_IO_Running: Yes #表示slave的日志读取线程开启
#Slave_SQL_Running: Yes #表示SQL执行线程开启
```

![](/files/XQMEY0CDqIWUBw8bZnk2)

**测试master新增表及表数据是否会同步到slave节点**

初始状态，数据库并不存在表，现在master创建test表 192.168.235.129\
![](/files/bjXVQqmBvr5XzNtl5rla)

用写账号write\_user新增test\_to\_slave表，然后能看到在slave节点同样生成<br>

![](/files/GeckkQP3ts0OKQsxHdNo)

```bash
#!/bin/bash
#docker_mysql_restart.sh（快速启动or重启mysql服务）
echo "正在停止所有docker里面的容器mysql..."
docker stop $(docker ps -q);
echo "停止成功,正在删除容器ing..."
docker rm mysql;

name=mysql;
port=3306;
fromData=/home/mysql/data;
toData=/var/lib/mysql;
fromConf=/home/mysql/conf.d;
toConf=/etc/mysql/conf.d;
password=ok5nnbwzfe653c39;

docker run \
--privileged=true \
--name $name \
-p $port:$port \
-v $fromData:$toData \
-v $fromConf:$toConf \
-e MYSQL_ROOT_PASSWORD=$password \
-d mysql:5.7

docker ps;

docker exec -it $(docker ps -q) /bin/bash;
```

![从mysql文件结构](/files/BGrYH30J8xw1I48z29NF)

![主 文件结构](/files/5gSMh2cryt5IEbFQQl26)

主3306 172.16.0.6

root ok5nnbwzfe653c39 \
主从账号 slave ok5nnbwzfe653c39

从3306 172.16.0.7 \
root ok5nnbwzfe653c39 \
主从账号 slave ok5nnbwzfe653c39


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xn--6o0a585a.gitbook.io/devops/shu-ju-ku/docker-da-jian-zhu-cong-shu-ju-ku-ji-du-xie-fen-li.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
