docker高级知识

1 docker复杂安装详情

mysql一主一丛集群搭建

mysql搭建主服务器

docker run -p 3307:3306 --name=mysql-master -v zzq/mysql-master/log:/var/log/mysql -v /zzq/mysql-master/data:/var/lib/mysql -v /zzq/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

在/zzq/mysql-master/config下创建my.cnf,内容如下

[client]
#设置客户端字符集
default_character_set=utf8
[mysqld]
#开启定时任务
event_scheduler=ON
#允许最大连接数	
max_connections=300
#最大等待时间单位s
wait_timeout = 28800
max_allowed_packet=500M
#服务端使用的字符集默认为8比特编码的latin1字符集
character_set_server=utf8
#设置服务端字符排序规则
collation_server=utf8_general_ci
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#开启查询缓存
explicit_defaults_for_timestamp=true
#skip-grant-tables
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#设置mysql连接数
max_connections=151
#设置不区分大小写
lower_case_table_names=1
#设置server_id,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,开启二进制日志,并指定日志文件的前缀为mysql-bin。
log-bin=mysql-master-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间,默认为0;表示不清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制终端,如:1062错误是值一些主键重复,10323错误是主从数据库数据不一致
slave_skip_errors=1062

在mysql-master上登入mysql设置和备份机的关系

create user ‘slave’@‘%’ identified by ‘123456’;

授权

grant replication slave,replication client on . to ‘slave’ @ ‘%’;

mysql搭建从服务器

docker run -p 3308:3306 --name=mysql-slave -v zzq/mysql-slave/log:/var/log/mysql -v /zzq/mysql-slave/data:/var/lib/mysql -v /zzq/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

在/zzq/mysql-slave/config下创建my.cnf,内容如下

[client]
#设置客户端字符集
default_character_set=utf8
[mysqld]
#开启定时任务
event_scheduler=ON
#允许最大连接数	
max_connections=300
#最大等待时间单位s
wait_timeout = 28800
max_allowed_packet=500M
#服务端使用的字符集默认为8比特编码的latin1字符集
character_set_server=utf8
#设置服务端字符排序规则
collation_server=utf8_general_ci
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#开启查询缓存
explicit_defaults_for_timestamp=true
#skip-grant-tables
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#设置mysql连接数
max_connections=151
#设置不区分大小写
lower_case_table_names=2
#设置server_id,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,开启二进制日志,并指定日志文件的前缀为mysql-bin。
log-bin=mysql-slave-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间,默认为0;表示不清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制终端,如:1062错误是值一些主键重复,10323错误是主从数据库数据不一致
slave_skip_errors=1062
#配置中继日志
relay_log=mysql-relay-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#slave设置只读(具有super权限用户除外)
read_only=1

在mysql-slaver上登入mysql,在从数据库中配置主从复制

在master进入mysql执行show master status;查看file和position,拿到从哪开始同步的信息

change master to master_host=‘宿主机ip’,master_user=‘slave’,master_password=‘123456’,master_port=3307,master_log_file=‘mysql-master-bin.000001’,masster_log_pos=617,master_connect_retry=30;

在这里插入图片描述
在从数据库中查看主从同步状态

show slave status \G;

在这里插入图片描述
在从数据库中开启主从同步

start slave;

redis集群搭建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

启动docker,新建6台redis实例,三主三从集群搭建

docker run -d --name redis-node-1 --net host --privileged=true -v /zzq/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381

docker run -d --name redis-node-2 --net host --privileged=true -v /zzq/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382

docker run -d --name redis-node-3 --net host --privileged=true -v /zzq/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383

docker run -d --name redis-node-4 --net host --privileged=true -v /zzq/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384

docker run -d --name redis-node-5 --net host --privileged=true -v /zzq/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385

docker run -d --name redis-node-6 --net host --privileged=true -v /zzq/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

在这里插入图片描述
进入docker容器,构建主从关系

redis-cli --cluster create 172.16.64.21:6381 172.16.64.21:6382 172.16.64.21:6383 172.16.64.21:6384 172.16.64.21:6385 172.16.64.21:6386 --cluster-replicas 1

–cluster-replicas 1 表示为每个master创建一个slave节点
在这里插入图片描述

在这里插入图片描述
产看集群状态

cluster info
cluster nodes

在这里插入图片描述

主从容错切换迁移案例

   主机宕机,从机会不会变成主机

啊手动阀
上面连接方式后面需要加上-c代表集群方式连接
在这里插入图片描述
查看集群信息

redis-cli --cluster check 172.16.64.21:6381

在这里插入图片描述
在这里插入图片描述
重启6381机器,6385还是主节点,6381是从节点
在这里插入图片描述

主从扩容案列

从三主三从变成四主四从(槽位如何重新分配)

docker run -d --name redis-node-7 --net host --privileged=true -v /zzq/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387

docker run -d --name redis-node-8 --net host --privileged=true -v /zzq/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

进入到node-7容器里面

docker exec -it redis-node-7 /bin/bash

将新增的6387节点(空槽号)作为master节点加入原集群(6381是原来集群的领路人)

redis-cli --cluster add-node 自己实际IP地址:6387 自己实际ip地址:6381
在这里插入图片描述

检查集群节点情况

redis-cli --cluster check 172.16.64.21:6381

在这里插入图片描述
重新分配槽位

redis-cli --cluster reshard ip地址:端口号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看重新分配的槽位信息

redis-cli --cluster check 172.16.64.21:6381

在这里插入图片描述

发现结果:不是重新洗牌分配,而是前面三个都给了6387一点槽位,为什么6387是3个新的区间,以前的还是连续?重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

给6387添加从节点

redis-cli --cluster add-node 172.16.64.21:6388 172.16.64.21:6387 --cluster-slave --cluster-master-id 6387的id号

在这里插入图片描述

主从缩容案列

在这里插入图片描述

dcoker stop redis-node-7

查看集群状态获取6387和6388的节点id

redis-cli --cluster check 172.16.64.21:6388

redis-cli --cluster del-node ip:从机端口 从机6388节点id
在这里插入图片描述

重新分配槽点(6381作为突破点,重置集群槽点)

redis-cli --cluster reshard 172.16.64.21:6381

在这里插入图片描述
在这里插入图片描述

2 dockerFile解析

Dcokerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本

在这里插入图片描述

关键字解释
from基本出现第一行,继承的父类/源头
maintainer维护者,镜像维护者的姓名和邮箱地址
run容器构建时需要运行的命令,另种格式sehll和exec格式,run是在docker build时运行;比如yum install
expose当前容器对外暴漏的端口
workdir指定在创建容器后,终端默认登录的进来的工作目录,一个落脚点
user指定该镜像以仕么杨的用户去执行,如果不指定默认是root,一般不指定
env运行时的环境变量 ,用来设置构建镜像过程中的设置环境 变量
add将宿主机目录下的文件拷贝进镜像且会自动处理url和解压tar压缩包
copy类似于add,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>的位置
volume容器数据卷,用于数据保存和持久化工作
cmd只当的格式和run类似,两种格式,shell和exec格式;shell格式:cmd<命令>;exec格式:cmd[“可执行文件”,“参数1”…];只有最后一条生效
entrypoint类似鱼cmd,但是不会被docker run后面的命令覆盖,而且这些命令的参数被当作参数送给entrypoint指定的程序

在这里插入图片描述

构建镜像命令

docker build -t 新镜像名字:TAG .

下面的补上在这里插入图片描述

删除虚悬镜像/没有tag和名字的镜像

docker image prune

3 docker微服务实战

1 将微服务jar包上传到指定目录
在这里插入图片描述
2 创建Dockerfile文件和jar目录在一起,内容如下

#基础镜像使用java
FROM java:8
#作者
MAINTAINER zhaozhiqiang
#volume指定临时文件目录为/tmp,在主机/zzq/project-info/volume-data目录下创建要给临时文件并链接到容器的/tmp
VOLUME /tmp
#将jar包添加到容器中并更名
ADD jeecg-cloud-nacos-2.4.6.jar pe-nacos.jar
#运行jar包
RUN bash -c 'touch /pe-nacos.jar'
ENTRYPOINT ["java","-jar","/pe-nacos.jar"]
#暴露8848端口作为微服务
EXPOSE 8848

3 构建Dockerfile

docker build -t pe-nacos:2.6 .

4运行容器

docker run -d -p 8848:8848 pe-nacos:2.6

4 docker网络

docker网络作用;1容器间的互联和通讯以及端口映射;2容器ip变动的时候可以通过服务名直接网络通讯而不受影响

在这里插入图片描述
在这里插入图片描述

查看网络 docker network ls
查看网络源数据 docker network inspect bridge/host/none
删除网络 docke network rm xxx网络名称
查看服务网络 docker inspect 网络名称

在这里插入图片描述
查看虚拟网桥(每个容器一个ip分配)
在这里插入图片描述
结论

docker容器内部ip是会变动的,服务名称固定但ip不固定

1 bridge网桥模式
在这里插入图片描述
2 host模式

直接使用宿主机的ip地址与外界进行通讯,不在需要额外进行NAT转化
在这里插入图片描述
比如下:

docker run -d -p 8080:8080 --network host --name mytomcat83 billygoo/tomcat8-jdk8
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/823e077107694f529ac0f683b0ff3ed2.png
在这里插入图片描述问题:docker启动时指定了 --network=host或-net=host,如果还指定了-p端口映射,钠这个时候就会报警告,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增
解决:使用docker的其他网络模式,列如 --network=bridge,这样就可以解决问题了,或者直接无视

3 自定义网络

docker run -d -p 8082:8080 --name=tomcat82 billygoo/tomcat8-jdk8
docker run -d -p 8083:8080 --name=tomcat83 billygoo/tomcat8-jdk8

按照上面演示,互ping可以通

在这里插入图片描述
互ping服务名

在这里插入图片描述
结论:容器之间ip可以互相通讯,但服务名成不能互通,这在微服务中网关调用是不行的
解决方案:使用自定义网络让服务名互通

#创建自定义网络
docker network create zzq_test 
#新建容器加入新建的zzq_test网络当中
 docker run -d -p 8082:8080  --network=zzq_test --name=tomcat82  billygoo/tomcat8-jdk8
 docker run -d -p 8084:8080  --network=zzq_test --name=tomcat84  billygoo/tomcat8-jdk8

在这里插入图片描述

默认情况下docker容器访问不了宿主机/etc/hosts里面配置的域名映射,解决方案如下
1 在docker-compose.yml中增加域名

extra_hosts:
    pe-mysql: 172.16.64.21

如果是docker build就是

docker run -d --name container_name --add-host zjq.com:172.2.3.4 image_name:tag;

2 在容器中的hosts增加配置(不推荐)

172.16.64.21  pe-mysql

3 在容器编排中自定义网络段,让业务服务器和redis/mysql映射到同一网段

services:
#业务服务器
  pe-nacos:
    networks:
       - zzq_net 
  mysql:
    networks:
       - zzq_net 
  redis:
    networks:
       - zzq_net 
networks:
   zzq_net: 

4 容器创建使用network host,和宿主机保持一致

network_mode: host

5 docker-compose容器编排

定义 (docker-compose.yml)

是docker官方的开源项目,负责实现对docker容器集群的快速编排

在这里插入图片描述
作用

一键部署,意见启动/停止,顺序编排

安装步骤

curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

卸载步骤

rm /usr/local/bin/docker-compose

docker-compose常用命令

docker-compose -h    //查看帮助
docker-compose up    //启动所有docker-compose服务
docker-compose up -d //启动所有docker-compose服务并后台运行
docker-compose down  //停止并删除容器/网络/卷/镜像
docker-compose exec yml里面的服务id  //进入容器实例内部yml文件中写的服务id  /bin/bash
docker-compose ps    //展示当前docker-compose编排过去的运行的所有容器
docker-compose top   //展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id  //产看容器输出日志
docker-compose config -q  //检查配置,有问题才由输出,不加-q所有输出
docker-compose restart  //重启服务
docker-compose  start     //启动服务
docker-compose stop     //停止服务

docker-compose编排微服务

version: "版本号"
services:
  #服务名称
  microService:
    image: 服务名称:版本号
    #容器名称指定的话,docker ps 容器名称就是指定的,不写的话容器名称有docker-compose.yml上一次目录_容器名称_n构成
    container_name: 容器名称
    #为容器设置主机名映射域名
    #hostname: xxx
    ports: 
        - "6001:6001"
    volumes:
        - /zzq/services:/data
    networks:
        - zzq_net
    depends_on:
        - redis
        - mysql
  redis:
    image: redis:6.0.8
    ports: 
        - "6379:6379"
    volumes:
        - /zzq/redis/redis.conf:/etc/redis/redis.conf
        - /zzq/redis/data:/data
    networks:
         #自定义网络相当于 docker run --network=zzq_net
        - zzq_net
    command: redis-server /etc/redis/redis.conf
  mysql:
    image: mysql:5.7
    enviroment:
       MYSQL_ROOT_PASSWORD: '123456'
       MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
       MYSQL_DATABASE: 'pe-boot'
       MYSQL_USER: 'root'
       MYSQL_PASSWORD: '123456'
     ports:
       - "3306:3306"
     volumes:
       - /zzq/mysql/log:/var/log/mysql
       - /zzq/mysql/data:/var/lib/mysql
       - /zzq/mysql/conf:/etc/mysql/conf.d
      networks:
        - zzq_net
      command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: #自定网络名称,让多个网桥容器能ping通服务名,在同一的网络名称下相当于 docker network create zzq_net
    zzq_net:      

在这里插入图片描述

docker-compose语法大全

语法解释
build./使用当前目录下的dockerfile进行构建;
images指定运行容器使用的镜像名称
container_name容器名
command覆盖容器启动后默认执行的命令(Dockerfile定义的CMD)。当Dockerfile定义了entrypoint的时候,docker-comose.yml定义的command会被覆盖。
entrypoint可以覆盖Dockerfile中定义的entrypoint命令。
env_file定义了在docker-compose.yml中使用的变量, 封装变化,提高docker-compose.yml文件的灵活性。
environmentenviroment定义的变量会覆盖.env文件中定义的重名环境变量
ports将容器的端口映射到宿主机的端口
volumes挂载一个目录或者一个已存在的数据卷容器,HOST:CONTAINER 格式定义共享的目录;HOST:CONTAINER:RO 定义容器只读的目录。
networks加入指定网络
version版本信息,定义关乎于docker的兼容性,Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
contextcontext 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url
dockerfile使用此 dockerfile 文件来构建,必须指定构建路径
args添加构建参数,这些参数是仅在构建过程中可访问的环境变量。
cache_from编写缓存解析镜像列表,此选项是v3.2中的新选项。
labels使用 Docker标签 将元数据添加到生成的镜像中,可以使用数组或字典。
shm_size设置容器 /dev/shm 分区的大小,值为表示字节的整数值或表示字符的字符串
target根据对应的 Dockerfile 构建指定 Stage
cap_add,cap_drop添加或删除容器功能
configs使用服务 configs 配置为每个服务赋予相应的访问权限,支持两种不同的语法
depends_on容器中服务之间的依赖关系
deploy指定与部署和运行服务相关的配置。
devices设置映射列表,与 Docker 客户端的 --device 参数类似
dns自定义 DNS 服务器
dns_search自定义 DNS 搜索域,可以是单个值或列表
expose暴露端口
init在容器内运行init,转发信号并重新获得进程。将此选项设置true是为服务启用此功能。
links链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名(SERVICE:ALIAS),与 Docker 客户端的 --link 有一样效果,会连接到其它服务中的容器。
logging配置日志服务
network_mode网络模式,用法类似于 Docke 客户端的 --net 选项,格式为:service:[service name],可以指定使用服务或者容器的网络。
extra_hosts域名映射

重点区别links,depends_on,extra_hosts,networks

depends_on:重点是依赖关系
links:它允许一个容器能够访问另一个容器的网络连接信息(如IP地址和端口),微服务中常用到gateway需要连接到nacos中,ip:port
extra_hosts:相当于域名/服务名和ip的映射
networks:同意网络容器间能胡同域名/服务名

6 docker轻量级可视化工具portainer(轻量级监控)

安装

docker pull portainer/portainer

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /zzq/portainer_data:/data --privileged=true portainer/portainer

访问http://172.16.64.21:8088/,
在这里插入图片描述

7 docker容器监控之CAdvisor+influxDB+granfana(重量级监控)

查看docker使用情况

docker stats

在这里插入图片描述
在/zzq/cig中编排三剑客CAdvisor+influxDB+granfana一件部署脚本

version: '3.1'
 
volumes:
  grafana_data: {}
 
services:
 influxdb:
  image: tutum/influxdb:0.9
  restart: always
  environment:
    - PRE_CREATE_DB=cadvisor
  ports:
    - "8083:8083"
    - "8086:8086"
  volumes:
    - ./data/influxdb:/data
 
 cadvisor:
  image: google/cadvisor
  links:
    - influxdb:influxsrv
  command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
  restart: always
  ports:
    - "8080:8080"
  volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
 
 grafana:
  user: "104"
  image: grafana/grafana
  user: "104"
  restart: always
  links:
    - influxdb:influxsrv
  ports:
    - "3000:3000"
  volumes:
    - grafana_data:/var/lib/grafana
  environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root


启动三剑客

docker-compose up -d

查看三个服务容器是否启动
收集服务CAdvisor: http://ip:8080/
存储服务inifluxdb: http://ip:8083/
展现服务grafana: http://ip:3000

配置数据源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BACKWASH2038

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值