Docker学习——MySQL主从复制、DockerFile编写、Docker网络、Docker-compose容器编排
MySQL主从复制
什么是MySQL主从复制
MySQL主从复制是MySQL数据库的一种复制方式,它允许数据从一个MySQL数据库服务器(主服务器)复制到一个或多个MySQL数据库服务器(从服务器)。此方法广泛用于提供数据的副本,实现数据备份、分流读请求、故障恢复等。
主从复制的原理
1. 二进制日志(Binary Log)
主服务器在执行完增删改等操作后,会在二进制日志中记录下这些操作事件。这些日志包含了改变数据库数据所需的全部信息。
2. I/O线程
从服务器启动后,会启动一个I/O线程,连接到主服务器,读取主服务器的二进制日志,并将读取到的日志信息写入到从服务器的中继日志(Relay Log)。
3. SQL线程
从服务器会启动一SQL线程,用来读取中继日志中的事件,按照事件的顺序逐一执行,至此完成了一次数据的复制。
主从复制默认是异步的,即主服务器写入二进制日志后即认为操作已完成,无需等待从服务器更新。这样就可以在主服务器上快速完成事务,但也可能导致主从服务器的数据在某个时间点不一致。
Docker上MySQL主从搭建的流程
1.搭建主服务器容器实例3307
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
注意,进入/mydata/mysql-master/conf目录下新建my.cnf,在配置文件中要加入下面内容:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
进入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
然后,在master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
2.搭建从服务器容器实例3308
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
同样也要加配置文件
进入/mydata/mysql-slave/conf目录下新建my.cnf并加入下面内容
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
3.配置主从同步
在主数据库中查看主从同步状态
show master status;
在从数据库中配置主从复制
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
参数说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
在从数据库中查看主从同步状态
show slave status \G;
在从数据库中开启主从同步
start slave;
主机新建库-使用库-新建表-插入数据
从机使用库-查看记录
成功查看到记录则同步成功。
DockerFile编写
什么是DockerFile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三步骤
· 编写Dockerfile文件
· docker build命令构建镜像
· docker run依镜像运行容器实例
常用保留字指令
· FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
· RUN
容器构建时需要运行的命令
· EXPOSE
当前容器对外暴露出的端口
· MAINTAINER
镜像维护者的姓名和邮箱地址
· WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
· ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
· VOLUME
容器数据卷,用于数据保存和持久化工作
· CMD
指定容器启动后的要干的事情
· ENV
· 用来在构建镜像过程中设置环境变量
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
Docker网络
什么是Docker网络
Docker启动后,会产生一个名为docker0的虚拟网桥
Docker网络的种类
· bridge模式:使用–network bridge指定,默认使用docker0
· host模式:使用–network host指定
· none模式:使用–network none指定
· container模式:使用–network container:NAME或者容器ID指定
自定义网络
容器挂了后ip会变,docker容器内部的ip是有可能会发生改变的,所以要使用自定义网络来维护好主机名和ip的对应关系(ip和域名都能ping通)
通过在docker run指令中加入–network选项来创建,如:
docker run -d -p 8081:8080 --network 自定义网络名称 --name tomcat81 billygoo/tomcat8-jdk8
常用指令
docker network --help
固定格式
docker network +
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Docker-Compose容器编排
什么是Compose
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。解决了容器与容器之间如何管理编排的问题。
安装步骤
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
再输入
docker-compose --version
出现版本号即为安装成功。
当然,现在docker自带compose,不需要下载
核心概念
· 一文件
docker-compose.yml
· 两要素
服务(service)
一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
工程(project)
由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
使用步骤
· 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
· 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
· 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
常用命令
以下为经常使用的compose命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose config # 检查配置
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
ll
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose config # 检查配置
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务