Docker高级篇

高级篇

mysql主从复制docker版

先说什么是mysql主从复制

​ mysql主从复制是有两个数据库,将主数据库(Master)的DDL和DML操作通过二进制日志传到从库(Slave)服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步

​ 优点:

  1. 主库出现问题,可以快速切换到从库提供服务
  2. 实现读写分离,降低主库访问压力
  3. 可以在从库中执行备份,以避免备份期间影响主库服务

原理

  1. Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
  2. 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log。
  3. 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镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本

构建三步骤

  1. 编写Dockerfile文件
  2. docker build命令构建镜像
  3. 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,不需要下载

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值