目录
2.进入/mydata/mysql-master/conf目录下新建my.cnf
7.进入/mydata/mysql-slave/conf目录下新建my.cnf
Redis cluster(集群)模式-docker版哈希槽分区进行数据存储
3.进入容器redis-node-1并为6台机器构建集群关系
将新增的6387节点(空槽号)作为master节点加入原集群
将6387的槽号清空,重新分配,本例将清出来的槽号都给6382
六.Docker容器监控之 CAdvisor+InfluxDB+Granfana
一.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
2.进入/mydata/mysql-master/conf目录下新建my.cnf
vim 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.修改完配置后重启master实例
docker restart mysql-master
4.进入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
5.master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
6.新建从服务器容器实例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
7.进入/mydata/mysql-slave/conf目录下新建my.cnf
vim 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
8.修改完配置后重启slave实例
docker restart mysql-slave
9.在主数据库中查看主从同步状态
show master status;
10.进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
11.在从数据库中配置主从复制
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
change master to master_host='192.168.31.215',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_connect_retry=30;
12.在从数据库中查看主从同步状态
show slave status\G;
13.在从数据库中开启主从同步
14.查看从数据库状态发现已经同步
15.主从复制测试
主机新建库-使用库-新建表-插入数据,ok
从机使用库-查看记录,ok
Redis cluster(集群)模式-docker版哈希槽分区进行数据存储
3主3从redis集群配置
1.关闭防火墙+启动docker后台服务
systemctl start docker
systemctl stop firewalld
2.新建6个docker容器redis实例
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
docker run -d --name redis-node-2 --net host --privileged=true -v /data/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 /data/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 /data/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 /data/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 /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
命令分步解释
--privileged=true 获取宿主机root用户权限
--cluster-enabled yes 开启redis集群
--appendonly yes 开启持久化
3.进入容器redis-node-1并为6台机器构建集群关系
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.31.215:6381 192.168.31.215:6382 192.168.31.215:6383 192.168.31.215:6384 192.168.31.215:6385 192.168.31.215:6386 --cluster-replicas 1
--cluster-replicas 1 表示为每个master创建一个slave节点
4.链接进入6381作为切入点,查看集群状态
cluster info cluster nodes
M | S |
1 | 5 |
2 | 6 |
3 | 4 |
5.数据读写存储
redis-cli -p 6381 -c
6.容错切换迁移
redis-node-5是1的从服务器,停掉1重新查看集群状态
恢复之前的主从关系,需要先启动node-1,再关闭node-5,在启动node-5
Redis主从扩容案例
新建6387、6388两个节点+新建后启动+查看是否8节点
docker run -d --name redis-node-7 --net host --privileged=true -v /data/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 /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker ps
进入6387容器实例内部
docker exec -it redis-node-7 /bin/bash
将新增的6387节点(空槽号)作为master节点加入原集群
将新增的6387作为master节点加入集群
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
6387 就是将要作为master新增节点
6382 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
redis-cli --cluster add-node 192.168.31.215:6387 192.168.31.215:6382
检查集群情况第1次
redis-cli --cluster check 真实ip地址:6381
***重新分派槽号***
命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.31.215:6382
检查集群情况第2次
redis-cli --cluster check 真实ip地址:6381
槽号分派说明
重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
**为主节点6387分配从节点6388**
命令:redis-cli --cluster add-node ip:slave(node-8)端口 ip:master(node-7)端口 --cluster-slave --cluster-master-id (node-7的ID)
redis-cli --cluster add-node 192.168.31.215:6388 192.168.31.215:6387 --cluster-slave --cluster-master-id c055442fe21761a72f9b6af596acf4f0cdf2d110
检查集群情况第3次
redis-cli --cluster check 192.168.31.215:6382
Redis主从缩容案例
目的:6387和6388下线
检查集群情况1获得6388的节点ID
redis-cli --cluster check 192.168.31.215:6382
将6388删除从集群中将4号从节点6388删除
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.31.215:6388 9df0bef58927e8463a75653fbad36254b4c65143
将6387的槽号清空,重新分配,本例将清出来的槽号都给6382
redis-cli --cluster reshard 192.168.31.215:6382
检查集群情况第二次
redis-cli --cluster check 192.168.31.215:6382
将6387删除
redis-cli --cluster del-node 192.168.31.215:6387 c055442fe21761a72f9b6af596acf4f0cdf2d110
检查集群情况第三次
redis-cli --cluster check 192.168.31.215:6382
DockerFile常用保留字指令
二.DockerFile解析
1.是什么
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官网
https://docs.docker.com/engine/reference/builder/
构建三步骤
编写Dockerfile文件 docker build命令构建镜像 docker run依镜像运行容器实例
2.DockerFile构建过程解析
Dockerfile内容基础知识
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数 2:指令按照从上到下,顺序执行 3:#表示注释 4:每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程
(1)docker从基础镜像运行一个容器 (2)执行一条指令并对容器作出修改 (3)执行类似docker commit的操作提交一个新的镜像层 (4)docker再基于刚提交的镜像运行一个新容器 (5)执行dockerfile中的下一条指令直到所有指令都执行完成
小总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
* Dockerfile是软件的原材料
* Docker镜像是软件的交付品
* Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例
3.DockerFile常用保留字指令
- FROM 当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条是from
- MAINTAINER 镜像维护者的姓名和邮箱地址
- RUN 容器构建时需要运行的命令 两种格式(shell格式[等同于命令行],exec格式)
- EXPOSE 当前容器对外暴露出的端口
- WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
- USER 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
- ENV 用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,
比如:WORKDIR $MY_PATH
- ADD 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 COPY src dest COPY ["src", "dest"]
- VOLUME 容器数据卷,用于数据保存和持久化工作
- CMD 指定容器启动后的要干的事情
- ENTRYPOINT 也是用来指定一个容器启动时要运行的命令
注意事项
CMD和前面RUN命令的区别 CMD是在docker run 时运行。 RUN是在 docker build时运行。 ENTRYPOINT类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序 命令格式:
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成 案例如下:假设已通过 Dockerfile 构建了 nginx:test 镜像:
是否传参 | 按照dockerfile编写执行 | 传参运行 |
Docker命令 | docker run nginx:test | docker run nginx:test -c /etc/nginx/new.conf |
衍生出的实际命令 | nginx -c /etc/nginx/nginx.conf | nginx -c /etc/nginx/new.conf |
小总结
4.案例
自定义镜像mycentosjava8
Centos7镜像具备vim+ifconfig+jdk8
jdk8链接:
链接:https://pan.baidu.com/s/1ilDD-wj1J1iiGy49fPMrpQ?pwd=yazt
提取码:yazt
编写
准备编写Dockerfile文件
FROM centos
MAINTAINER why<w18839510398@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install unzip
RUN yum -y install net-tools
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
ADD OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk8u312-b07
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 build -t 新镜像名字:TAG .
docker build -t centosjava8:1.5 .
运行
docker run -it 新镜像名字:TAG
docker run -it --name java8-1 centjava8:1.5
5.虚悬镜像
仓库名、标签都是<none>的镜像,俗称dangling image
查看
docker image ls -f dangling=true
删除
docker image prune
6.小总结
三.Docker网络
默认创建3大网络模式
bridge host null
常用基本命令
All命令
docker network --help
查看网络
docker network ls
查看网络源数据
docker network inspect xxx网络名字
删除网络
docker network rm xxx网络名字
能干嘛
容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响
网络模式
bridge模式
使用--network bridge指定,默认使用docker0 Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
host模式
使用--network host指定 直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
none模式
使用--network none指定 禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
container模式
使用--network container:NAME或者容器ID指定 案例2 docker run -it --name alpine1 alpine /bin/sh docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh 运行结果,验证共用搭桥 假如此时关闭alpine1,再看看alpine2 docker stop alpine1
自定义网络
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通) 案例
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
上述成功启动并用docker exec进入各自容器实例内部 按照IP地址ping是OK的 按照服务名ping结果???
使用自定义网络 创建自定义网络 docker network create why_network 新建容器加入上一步新建的自定义网络
docker run -d -p 8081:8080 --network why_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network why_network --name tomcat82 billygoo/tomcat8-jdk8
Docker平台架构图解
整体说明
Docker 运行的基本流程为:
1 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
2 Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
3 Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
4 Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
5 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境。
6 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。
7 Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
整体架构
四.Docker-compose容器编排
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
能干嘛
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
去哪下
官网
https://docs.docker.com/compose/compose-file/compose-file-v3/
官网下载
https://docs.docker.com/compose/install/
安装步骤
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
Compose核心概念
一文件
docker-compose.yml
两要素
服务(service) 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
工程(project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose使用的三个步骤
编写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 exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml 文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
使用Compose
编写docker-compose.yml文件
mkdir /mycompose
cd /mycompose
vim docker-compose.yml
version: "3"
services:
nginx:
image: nginx:latest
container_name: nginx88
ports:
- "88:80"
networks:
- why_network
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY: 'no'
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- why_network
command: --default-authentication-plugin=mysql_native_password
networks:
why_network:
执行
docker-compose up
docker-compose up -d
停止
docker-compose stop
五.Docker轻量级可视化工具Portainer
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
安装
官网
https://www.portainer.io/
https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux
步骤
docker命令安装
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
第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000
用户名,直接用默认admin 密码记得8位,随便你写 设置admin用户和密码后首次登陆 选择local选项卡后本地docker详细信息展示 上一步的图形展示,能想得起对应命令吗?
六.Docker容器监控之 CAdvisor+InfluxDB+Granfana
通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据,一般小公司够用了。。。。但是,docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能
容器监控3剑客CAdvisorInfluxDBGranfana 总结
compose容器编排
新建目录
mkdir /mydocker/cig
cd /mydocker/cig
新建3件套组合的 docker-compose.yml
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文件
docker-compose up
查看三个服务容器是否启动
测试
浏览cAdvisor收集服务,http://ip:8080/
浏览influxdb存储服务,http://ip:8083/ 浏览grafana展现服务,http://ip:3000 默认帐户密码(admin/admin)
配置步骤
配置数据源 选择influxdb数据源 配置细节 配置面板panel
到这里cAdvisor+InfluxDB+Grafana容器监控系统就部署完成了