系列文章目录
前言
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协助我们需要关心的问题很多,这也是很多软件公司不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。
Docker之所以发展如此迅速,针对运维它给出了一个标准化的解决方案。所以,现在Docker成为了开发和运维必备的技能之一,极大便利的帮助解决了应用的环境和版本迭代问题。
本系列文章让你轻松进入docker的世界!
一、获取mysql镜像
通过Docker Hub查询mysql镜像信息,选择合适的版本
这里采用5.7版本,于是开始下载镜像:docker pull mysql:5.7
[root@VM-0-12-centos docker]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ...
5.7: Pulling from docker.io/library/mysql
b4d181a07f80: Pull complete
a462b60610f5: Pull complete
578fafb77ab8: Pull complete
524046006037: Pull complete
d0cbe54c8855: Pull complete
aa18e05cc46d: Pull complete
32ca814c833f: Pull complete
52645b4af634: Pull complete
bca6a5b14385: Pull complete
309f36297c75: Pull complete
7d75cacde0f8: Pull complete
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for docker.io/mysql:5.7
查看下载好的mysql镜像:docker images
[root@VM-0-12-centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 09361feeb475 10 days ago 447 MB
二、启动mysql容器
参考Docker Hub上的mysql的启动参数说明
创建 /app/docker/mysql/v1-conf 目录和 /app/docker/mysql/v1-data 目录,用于外挂mysql的配置文件和数据。
编写mysql的配置config-file.cnf,存入/app/docker/mysql/v1-conf目录,内容容下:
[mysqld]
# 同一局域网要唯一
server-id=1
# 开启二进制日志功能
log-bin=mysql-bin
执行启动:docker run --name mysql01 -p 3306:3306 -v /app/docker/mysql/v1-conf:/etc/mysql/conf.d -v /app/docker/mysql/v1-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
[root@VM-0-12-centos v2-data]# docker run --name mysql01 -p 3306:3306 -v /app/docker/mysql/v1-conf:/etc/mysql/conf.d -v /app/docker/mysql/v1-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
fe09d09fb6dd7d2247c3591ff3ef61341c3f672becde075153af3fc99b13b608
- --name mysql01:启动的容器起名叫mysql01;
- -p 3306:3306:容器服务的端口和宿主机端口绑定(宿主机端口:容器服务端口),这样访问宿主机对应端口则可以访问到容器内服务;
- -v /app/docker/mysql/v1-conf:/etc/mysql/conf.d:容器卷,把容器内的目录和宿主机的目录绑定,便于配置文件的更改和数据的持久化保留,这里是配置目录外挂;
- -v /app/docker/mysql/v2-data:/var/lib/mysql:mysql数据目录外挂到宿主机;
- -e MYSQL_ROOT_PASSWORD=123456:指定mysql的密码;
- -d:后台启动(守护进程),大多数应用都要后台启动,不然当前服务窗口关闭后,服务便关闭了;
查看启动的容器:docker ps
[root@VM-0-12-centos v2-data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe09d09fb6dd mysql:5.7 "docker-entrypoint..." 5 seconds ago Up 4 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql01
使用数据库工具连接mysql01,连接成功
三、搭建从机
参照第二大步骤,编写从机的配置文件 config-file.cnf,存入 /app/docker/mysql/v2-conf 中,文件内容如下:
[mysqld]
# 同一局域网要唯一
server-id=2
# 开启二进制日志功能
log-bin=mysql-bin
# 配置中继日志
relay_log=edu-mysql-relay-bin
启动从机:docker run --name mysql01 -p 3307:3306 -v /app/docker/mysql/v2-conf:/etc/mysql/conf.d -v /app/docker/mysql/v2-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
[root@VM-0-12-centos v2-conf]# docker run --name mysql02 -p 3307:3306 -v /app/docker/mysql/v2-conf:/etc/mysql/conf.d -v /app/docker/mysql/v2-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2d4e6b85080a981a171e7913bdc65973352a85af5f16074e93c3bced542a4751
查看启动的容器,并用数据库工具进行连接测试
[root@VM-0-12-centos v2-conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d4e6b85080a mysql:5.7 "docker-entrypoint..." 6 seconds ago Up 6 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp mysql02
94dd6f04df31 mysql:5.7 "docker-entrypoint..." 17 minutes ago Up 17 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql01
四、主从搭建
1、创建同步用户
Master数据库myslq01创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
使用工具连接上mysql01,选择mysql数据库后执行如下代码:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
2、查看主机信息
执行 show master status; 查询二进制日志文件名和偏移量。
注意:File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
3、从机绑定主机
change master to master_host='172.18.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=619, master_connect_retry=30;
- master_host:Master的地址,指的是容器的独立IP,可以通过 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器ID或者容器名称 指令获取
- master_user:用于数据同步的用户
- master_password:用于同步的用户的密码
- master_port:Master的端口号,指的是容器的端口号
- master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
- master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
- master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
4、开启主从同步
在从机上执行语句:start slave;
执行sql show slave status ,查询主从同步是否开启成功? 如果Slave_IO_Running和 Slave_SQL_Running都为Yes,则表明同步成功。
如果Slave_IO_Running一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的:
- 网络不通:检查ip,端口
- 密码不对:检查是否创建用于同步的用户和用户密码是否正确
- pos不对:检查Master的 Position
5、测试主从复制
在主机mysql01上创建test数据库,然后刷新从机数据库列表