高级篇
mysql主从复制docker版
先说什么是mysql主从复制
mysql主从复制是有两个数据库,将主数据库(Master)的DDL和DML操作通过二进制日志传到从库(Slave)服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步
优点:
- 主库出现问题,可以快速切换到从库提供服务
- 实现读写分离,降低主库访问压力
- 可以在从库中执行备份,以避免备份期间影响主库服务
原理
- Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
- 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log。
- slave重做中继日志中的事件,将改变反映它自己的数据。
docker版
流程
创建主服务数据库master
docker run -p 3307:3306 --name=mysql-master \
-v /tmp/mysqlmaster/log:/var/log/mysql \
-v /tmp/mysqlmaster/data:/var/lib/mysql \
-v /tmp/mysqlmaster/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
主服务写配置文件
[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
重启容器
docker restart mysql-master
进入容器给容器创建主从复制的同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
在创建从服务器数据库
docker run -p 3307:3306 --privileged=true --name=mysql-slave \
-v /atguigu/mysql-slave/log:/var/log/mysql \
-v /atguigu/mysql-slave/data:/var/lib/mysql \
-v /atguigu/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
从服务写配置文件
[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_iog配置中继日志
relay_log=mall-mysql-relay-bin
## log_siave_updates表示silave将复制事件写进自己的二进制日志log_slave_updates=1
##slave设置为只读(具有super权限的用户除外)
read_only=1
进入到主服务登录mysql查看主从同步状态
show master status;
进入到从服务器配置主从复制
change master to master_host='192.168.10.104', master_user='slave' ,master_password='123456', master_port=3306,master_log_file='mall-mysql-bin.000007', master_log_pos=1447,master_connect_retry=30;
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数 nmaster_connect_retry:连接失败重试的时间间隔,单位为秒。
在从数据库中查看主从同步的状态
show slave status\G;
在从数据库开启主从同步
start slave;
Dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本
构建三步骤
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run 镜像运行容器实例
DockerFile常用保留字指令
看脑图
案例
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
虚悬镜像
虚悬镜像没有存在价值,可以删除
用以下命令删除
dockerimage prune
docker network
docker启动后,会产生一个名为docker0的虚拟网桥,通过docker0和宿主机以及容器和容器之间进行网络通信
不能固定写死ip,因为容器挂了后ip会变,docker容器内部的ip是有可能会发生改变的要用名字
network常用命令
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
network网络模式
- bridge 为每一个容器分配,设置IP等,并将容器连接到docker0,默认设置
- host 容器不会虚拟出自己的网卡等,而是使用宿主机的IP和端口
- none 一般不用,用到在查
- container 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等
docker network之bridge
宿主机上的网桥模式都是docker0 ->类似一个交换机有一堆接口,每个接口叫veth,提供给本地主机和容器内分别创建一个虚拟接口,让他们联通
每个容器内部有一块网卡,每个接口叫eth0
docker0上每个veth系诶某个容器实例内部的eth0,一一匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nFCjJsYJ-1689603750142)(C:\Users\谢金桐\AppData\Roaming\Typora\typora-user-images\image-20230717204859601.png)]
docker network之host
直接使用宿主机的IP地址与外界进行通信,不再需要额外进行NAT转换
容器不会获得一个独立的Network Namespace, 而是和宿主机公用一个Network Namespace.容器使用宿主机的IP和端口.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBNrIBHV-1689603750143)(C:\Users\谢金桐\AppData\Roaming\Typora\typora-user-images\image-20230717205344140.png)]
正确写法
不用指定端口,加上–network=host
docker run -d -p --network host --name xxx xxx
多台host则ip递增
docker network之none
在none模式下,并不为Docker容器进行任何网络配置
也就是说,这个Docker容器没有网卡,IP,路由等信息,只有一个Io标志(就是127.0.0.1表示本地回环)
需要我们自己为Docker容器添加网卡配置
docker run -d -p --network none --name xxx xxx
docker network之container
新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等
但,除了网络方面,其他方面还是隔离的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3z7v0i43-1689603750143)(C:\Users\谢金桐\AppData\Roaming\Typora\typora-user-images\image-20230717210728293.png)]
docker network之自定义network
默认是bridge
容器用自定义network可以通过服务名来ping通
compose
可以管理多个Docker容器组成一个应用. 需要定义一个YAML格式的配置文件docker-compose.yml, 写好多个容器之间的调用关系. 然后,一个命令就可以同时启动/关闭这些容器
Docker-Compose 是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。
Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。
Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
核心概念:
●服务(service):一个个应用容器实例
●工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义
Compose使用的三个步骤:
1编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
2编写 docker-compose.yml,定义一个完整的业务单元,安排好整体应用中的各个容器服务
3执行 docker-compose up 命令,其创建并运行整个应用程序,完成一键部署上线
现在docker自带compose,不需要下载
些容器。
Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。
Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
核心概念:
●服务(service):一个个应用容器实例
●工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义
Compose使用的三个步骤:
1编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
2编写 docker-compose.yml,定义一个完整的业务单元,安排好整体应用中的各个容器服务
3执行 docker-compose up 命令,其创建并运行整个应用程序,完成一键部署上线
现在docker自带compose,不需要下载