Docker高级篇

Docker复杂安装详说

安装MySQL主从复制

主从复制的原理

需要另外学习!!!

步骤:主:3307-从:3308

1、启动3307

docker run -p 3307:3306 -d --privileged=true --name mysql-master 
-v /wxx/mysql-master/log:/var/log/mysql
-v /wxx/mysql-master/data:/var/lib/mysql 
-v /wxx/mysql-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=wangxinxin  mysql:5.7

2、编辑 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

3、重启容器

4、进入容器-数据库,创建从用户并授权

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';

5、启动3308

docker run -p 3308:3306 -d --privileged=true --name mysql-slave 
-v /wxx/mysql-slave/log:/var/log/mysql
-v /wxx/mysql-slave/data:/var/lib/mysql 
-v /wxx/mysql-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=wangxinxin  mysql:5.7

6、编写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

7、重启容器

8、主数据库查看状态

show master status;

9、进入slave进行配置

从数据库配置主从复制

change master to master_host='192.168.65.134',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_connect_retry=30; 

在这里插入图片描述

10、从数据库查看状态

show slave status \G;(键值对展示)

11、从数据库开始主从同步

start slave;

12、查看从数据库状态 同10

13、校验

Redis集群-分布式存储案例真题

Q:1-2亿条数据需要缓存,请问如何设计这个存储案例?

A:分布式存储,redis如何落地?以下三种方式

1、哈希取余分区
在这里插入图片描述

在这里插入图片描述

2、一致性哈希算法分区

1)设计目标为了解决分布式缓存数据变动和映射问题。某个问题宕机,分母改变,数据获取不正确。即当服务器数量变动时,尽量减小 客户端导服务器映射关系的影响。

2)算法构建一致性哈希环;服务器IP节点映射;KEY落到服务器的落键规则。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3)优点–解决了取余哈希算法中的容错性、扩展性限制

在这里插入图片描述

在这里插入图片描述

4)缺点–数据倾斜问题

在这里插入图片描述

在这里插入图片描述

3、哈希槽分区

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3主3从-redis集群
master1 6381master2 6382master3 6383
slave1 6385slave2 6386slave3 6384

1、创建命令

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

在这里插入图片描述

2、进入redis,执行命令

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

3、查看集群信息

redis-cli -p 6381
cluster info
cluster nodes
主从容错迁移切换方案

1、数据读写存储

redis-cli -p 6381 -c   
-c : 以集群方式访问redis,优化路由,可以在6381上存储导2、3任何一个redis中
查看集群信息:
redis-cli --cluster check host:6381

2、容错切换迁移

停止6381的容器,进入6382,cluster nodes 查看集群的情况

在这里插入图片描述

主从扩容案例

新增6387为master ,6388为slave

1、启动

2、进入其中一个redis查看

docker exec -it …

3、将新增的节点6387(空槽号)为master节点加入原集群

redis-cli --cluster add-node ip:6387 ip:6381
6387对标6381

4、重新分配槽号

redis-cli --cluster reshard ip:port
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 26ef597c3d911ef3f11c68c5b500211921e81e7b(6387的ID)
Source node #1: all
yes

5、为主节点分配从节点6388

redis-cli --cluster add-node ip:slave-port ip:master-port --cluster-master-id master-node-ID
master-node-ID从redis-cli --cluster check ip:port 命令获取
主从缩容案例

1、先删除从节点6388

redis-cli --cluster del-node ip:port slave-node-id

2、清出来的槽号重新分配 6387->6381

redis-cli --cluster reshard 192.168.65.137:6381
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? node-ID 槽号接收节点ID
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: node-ID 槽号发送节点ID
Source node #2: done

可以多次移动槽位,4096个可以分为2000、1000、1096等等

3、删除主节点6387

redis-cli --cluster del-node ip:port master-node-id

DockerFile解析

含义

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

在这里插入图片描述

编写规则

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的流程

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器作出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker在基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成

在这里插入图片描述

在这里插入图片描述

Dockerfile 保留字

FROM:指定基础镜像
MAINTAINER:镜像维护者的姓名等信息
RUN:容器构建时需要运行的命令
	两种格式:RUN <命令行命令>  /或者/   RUN ["可执行文件","参数1","参数2"]
	docker build时运行
EXPOSE:当前容器对外暴露端口
WORKDIR:指定在容器创建后,进入容器的默认工作目录
USER:指定镜像执行用户,默认root
ENV:用来在构建镜像的过程中指定环境变量,在这里定义变量,后续Dockerfile的设置中可以用$字符进行引用
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY:拷贝文件和目录到镜像中。
	将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定容器启动后要干的事情
	两种格式:CMD <命令行命令>  /或者/   CMD ["可执行文件","参数1","参数2"]
	dockerfile中可以有多个CMD文件,但是只有最后一个生效,CMD会被docker run 之后的参数替换
	docker run时运行
ENTRYPOINT:指定容器启动后要干的事情
	类似于CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序
	ENTRYPOINT ["executeable","param1","param2",...]
	ENTRYPOINT和CMD一起使用,CMD只是传参给ENTRYPOINT

在这里插入图片描述

Dockerfile执行命令

docker build -t imageName:Tag .

虚悬镜像

因为构建或者删除的时候出现错误导致仓库和标签为空,这类镜像需要删除,存在安全隐患

imageName and Tag均为<none>

查询当前所有虚悬镜像

docker image ls -f dangling=true

删除所有虚悬镜像

docker image prune

Docker微服务实战

idea 项目maven package–>上传JAR包到虚拟机–>在JAR包同目录下编写Dockerfile文件–>docker build -->docker run 运行

Docker网络

1、docker启动后,ifconfig命令会出现一个新的docker0网桥模式

2、查看当前docker的网络 docker network ls

​ 默认创建3大网络模式 bridge host none

网络模式简介
bridge为每一个容器分配、设置IP等,并将容器连接到一个docker0。虚拟网桥,默认为该模式。
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥链接,IP等。
container新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等。

3、可以使用命令创建、删除、查看网络

4、能干吗?容器间的互联和通信以及端口映射;;容器IP变动时候可以通过服务名直接网络通信二不受影响

#create docker u1/u2
docker run -it --name u1 ubuntu bash
docker run -it --name u2 ubuntu bash

#check u1/u2 network ,IP not equal 
docker inspect u1  
	Networks---IPAddress --> IP
docker inspect u2
	Networks---IPAddress --> IP

#u2挂了,新建u3,此时u2的IP就赋值给了u3,因为IP会变化,所以自己创建网络模式,使用自己的

5、 bridge

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6、host

7、none

只有lo标志,127.0.0.1本地回环

在这里插入图片描述

8、container

在这里插入图片描述

tomcat有冲突,使用alpine举例

9、自定义网络

若在不同的docker间通信,如何操作???

新建自定义网络

docker network create xx

新建容器加入新建的自定义网络

docker run -d -p 8081:8080 --network xx --name t1
ping 服务名 可以通,但是bridge模式ping服务名不通

Docker-compose容器编排

容器过多时,需要容器的管理,compose实现Docker集群的编排。

YAML配置文件compose.yml,写好多个容器之间的调用关系。

在这里插入图片描述

安装

1 下载
curl -L "https://github.com/docker/compose/releases/download/1.27.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果无法下载,可以直接去GitHub上下载到本地上传到服务器
https://github.com/docker/compose/releases找到版本下载docker-compose-Linux-x86.64
上传服务器,复制到指定位置的指定文件中,docker-compose为二进制文件
cp 上传位置  /usr/local/bin/docker-compose

2 赋权
chmod +x /usr/local/bin/docker-compose

3 校验
docker-compose --version

核心概念

一文件:docker-compose.yml

两要素:服务—一个个应用容器实例;工程—由一组关联的容器组成一个完整业务单元,由docker-compose.yml定义。

使用

1、编写Dockerfile定义各个微服务应用并构建出对应的镜像文件

2、使用docker-compose配置文件定义一个完整的业务单元,安排好整体应用中的各个容器服务

3、执行docker-compose up命令启动并运行整个应用程序,完成一键部署上线

在这里插入图片描述

编排微服务

1、一个微服务使用redis/mysql,编写配置文件,文件位置与jar包同级

version: "3"

services:
  microService:
    image: xx:1.0
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /microService:/data
    networks:
      - xx
    depends_on:
      - redis
      - mysql

  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks:
      - xx
    command: redis-server /etc/redis/redis.conf

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '12345'
      MYSQL_ALLPW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'DB2021'
      MYSQL_USER: 'XX'
      MYSQL_PASSWORD: '12345'
    ports:
      - "3306:3306"
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.cnf:/etc/my.cnf
      - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - xx
    command: --default-authentication-plugin=mysql_native_password
#指定网络,所有的docker容器在同一个网段
networks:
  xx:

2、修改服务的yml,将固定写死的IP换成服务名 redis mysql

3、maven package 上传

4、编写Dockerfile 构建 docker build …

5、一键部署docker-compose up

6、查看当前网络,docker network ls ,docker会自己创建网络,在docker目录下

7、docker ps 查看

8、关停 docker-compose stop

Docker轻量级可视化工具Portainer

监控、统计

安装

docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

主机访问linux的IP,端口是9000

首次登录,创建账号

相当于 命令 docker system df

Docker容器监控之CAdvisor+InfluxDB+Granfana

  • 查看容器的实时信息,只统计两分钟的日志
docker stats
  • CAdvisor监控收集 + InfluxDB存储数据 + Granfana展示图表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

compose编排

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
    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 config -q

启动并浏览

cadvisor: http://ip:8080/

influxdb: http://ip:8083/

grafana: http://ip:3000/

主机无法访问,报错,以下为解决方案,可以正常访问

docker警告:WARNING: IPv4 forwarding is disabled. Networking will not work._杰哥的技术杂货铺的博客-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值