OS Version: Window 10(专业版)

Docker Version: Version 17.03.1-ce-win12 (12058)


1.创建共享目录

Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

1. Windoiw 环境需要先设置共享目录才可以挂载, Setting 选择 Share Driver. 选择一个磁盘进行共享.
2. 在磁盘上建立docker-share-data目录,并在其中创建chapter-1目录,chapter-1作为共享目录,在其中分别建立master和slave目录分别存放数据库集群数据

image

1. mkdir docker-share-data/chapter-1/master
2. mkdir docker-share-data/chapter-1/slave

2.创建Docker镜像

2.1 下载镜像

docker pull mysql:5.7

2.2 创建Master 容器

参数 | 作用
---|---
-name | 容器名称
-e MYSQL_ROOT_PASSWORD | 数据库root用户密码
-p 13306:3306 | 映射到本机的端口13306到容器3306
-v <本机的数据库存放目录>:/var/lib/mysql | 挂载数据

docker run --name mysql-master -p 13306:3306 -v  d:/docker-share-data/chapter-1/master/data:/var/lib/mysql  -v d:/docker-share-data/chapter-1/master/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=000000 -d mysql

2.4 创建slave容器

docker run --name mysql-slave -p 23306:3306 -v  d:/docker-share-data/chapter-1/slave/data:/var/lib/mysql  -v d:/docker-share-data/chapter-1/slave/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=000000 -d mysql

2.5 执行docker ps -a 命令可以查看刚刚创建的master容器
image

3.构建mysql主从结构

3.1 在d:/docker-share-data/chapter-1/master/conf.d 目录下,配置文件 my.cnf 添加

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

3.2 在d:/docker-share-data/chapter-1/slave/conf.d 目录下,配置文件 my.cnf 添加

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

3.3 分别启动 mysql-master/mysql-slave

docker start mysql-master

docker start mysql-slave

3.4 访问mysql-master数据库,查看Master信息(可以进入容器里面查看,也可以在宿主远程连接) 在命令行运行命令:

show master status;

image

3.5 访问mysql-slave数据库 (可以进入容器里面查看,也可以在宿主远程连接) 进行集群配置.
在命令行执行:

change master to master_host='172.17.0.2', master_user='root', master_password='000000', master_log_file='mysql-bin.000001', master_log_pos=154;

PS: master_host 可以通过如下命令查询

1. docker exec -it mysql-master bash
2. ip a

image

3.6 启动Slave

start slave;

3.7(创建好之后,会发现master和slave之间会同步,比如master中创建数据库,slave中也会自动创建,在master中更改数据,slave中也会自动修改)

如果想清理本地docker环境,确保后续实验的正确运行

在Windows上使用以下命令:

FOR /f "tokens=" %i IN ('docker ps -a -q') DO docker stop %i
FOR /f "tokens=
" %i IN ('docker ps -a -q') DO docker rm %i