docker

文章目录

什么是docker

docker是用来你解决开发代码在不同环境下不能正常运行的工具。它将传统的环境配制打包成镜像,完全将程序的运行环境复制下来,再部署到其他服务器上时,同时将docker打包的镜像复制过去。这样就不会存在环境差异问题了。

docker的理念

  • 一次镜像,处处运行
  • 从搬家到搬楼,平滑迁移
  • 本质类似于vmware, 只要linux镜像文件相同,所生成的虚拟机就是相同的

与虚拟机技术的区别

虚拟机技术的痛点

  • 资源占用多
  • 冗余步骤多
  • 启动慢

docker与虚拟机的区别
docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面上实现虚拟化。故与传统虚拟机相比,docker的优势在于启动速度快、占用体积小。

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。

docker的作用

随着微服务架构和Docker的发展, 大量的应用会通过微服务方式架构, 应用的开发构建将变成搭乐高积木一样, 每个Docker容器将 变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容, 使应用系统的扩容从原先的天级变成分钟级甚至秒级。

应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来 , 不会因为底层基础架构和操作系统的不一致性给应用带来影响, 产生新的BUG。当出现程序异常时, 也可以通过测试环境的相同 容器进行快速定位和修复。

Docker是内核级虚拟化, 其不像传统的虚拟化技术一样需要额外的Hypervisor支持, 所以在一台物理机上可以运行很多个容器实 例, 可大大提升物理服务器的CPU和内存的利用率。
在这里插入图片描述
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地, Docker将这个模 型运用到自己的设计中, 唯一不同的是:集装箱运输货物, 而Docker运输软件。

docker三要素

镜像(image)

Docker镜像(Image) 就是一个只读的模板。镜像可以用来创建Docker容器, 一个镜像可以创建很多容器。 它也相当于是一个root文件系统。比如官方镜像centos:7就包含了完整的一套centos:7最小系统的root文件系统。 相当于容器的“源代码”, docker镜像文件类似于Java的类模板, 而docker容器实例类似于java中new出来的实例对象。

在这里插入图片描述

docker镜像的底层(UnionFS联合文件系统)

UnionFS(联合文件系统) :Union 文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统, 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可 丁以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) 。Union文件系统是Doc cker镜像的基础。镜像可以通过分层来进行继承, 基于基础镜像(没有父镜像) , 可以制作各种 具体的应用镜像。 特性:一次同时加载多个文件系统, 但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的

docker镜像的加载原理

Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成, 这种层级的文件系统UnionFS。

boot fs(boot filesystem) 主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载boot fs文件系统, 在 Docker镜像的最底层是引导文件系统boot fs。这一层与我们典型的Linux/Unix系统是一样的, 包含boot加载器和内核。当boot加载完 成之后整个内核就都在内存中了, 此时内存的使用权已由boot fs转交给内核, 此时系统也会卸载boot fs。

rootfs(root filesystem) , 在boot fs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种 不同的操作系统发行版, 比如Ubuntu, Centos等等。
在这里插入图片描述
对于一个精简的OS, rootfs可以很小, 只需要包括最基本的命令、工具和程序库就可以了, 因为底层直接用Host的kernel, 自己只 需要提供rootfs就行了。由此可见对于不同的linux发行版, boot fs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用 boot fs。

容器(container)

1从面向对象角度
Docker利用容器(Gon tainer) 独立运行的一个或一组应用, 应用程序或服务运行在容器里面, 容器就类似于一个虚拟化的运行环 境, 容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样, 镜像是静态的定义, 容器是镜像运行时的实体。容器为镜 像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

2从镜像容器角度
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等) 和运行在其中的应用程序。

docker镜像与容器位置

Docker镜像层都是只读的, 容器层是可写的
当容器启动时, 一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层",“容器层“之下的都叫“镜像层“。

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”, “容器层”之下的都叫“镜像层”。
所有对容器的改动-无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
在这里插入图片描述

仓库(repository)

是集中存放镜像的地方。

  • 仓库分为公开仓库 (Public) 和私有仓库(Private) 两种形式。
  • 最大的公开仓库是Docker Hub(https://hub.docker.com/) , 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等

小结

需要正确的理解仓库/镜像/容器这几个概念:
Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依 赖打包好形成一个可交付的运行环境,这个打包好的 运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实 列(类似Java中new出来一个对象) 。

image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。 同一个image文件, 可以生成多个同时运行的容器 实例。

镜像文件
image文件生成的容器实例, 本身也是一个文件, 称为镜像文件。

容器实例
一个容器运行一种服务, 当我们需要的时候, 就可以通过docker客户端创建 一个对应的运行实例,也就是我们的容器

仓库
就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库 库中拉下来就可以了。

docker工作原理

Docker是一个Client-Server结构的系统, Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问, 守护进程从客户端 接受命令并管理运行在主机上的容器。容器, 是一个运行时环境, 就是我们前面说到的集装箱。可以对比mysql演示对比讲解。
在这里插入图片描述

Docker是一个C/S模式的架构, 后端是一个松耦合架构, 众多模块各司其职。
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容器运行资源或执行用户指令等操作时, 则通过Exec driver来完成。
  7. Lib container是一项独立的容器管理包, Network driver以及Exec driver都是通过Lib container来实现具体对 时容器进行的操作。

docker安装

前提条件

安装的linux必须在3.8版本以上,可用以下命令查看

cat /etc/redhat-release

在这里插入图片描述

官方安装步骤

官方地址

安装

stpe1: 安装gcc相关

yum -y install gcc
yum -y install gcc-c++

step2: 安装所需软件包

yum install -y yum-utils

step3: 设置仓库(阿里云)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

step4: 更新软件包

yum makecache fast

step5: 安装docker引擎

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

step6: 启动docker

systemctl start docker

step7: 测试
查看版本号

docker version

运行hello-world

docker run hello-world

卸载操作

systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

配置阿里云镜像加速器

登录阿里云,搜索容器
在这里插入图片描述
点击镜像工具 > 镜像加速器,按步骤操作
在这里插入图片描述

docker常用命令

帮助启动类命令

启动docker

systemctl start docker

停止docker

systemctl stop docker

重启docker

systemctl restart docker

查看docker状态

systemctl status docker

开机启动

systemctl enable docker

查看docker概要信息

docker info

查看总体帮助文档

docker --help

查看命令帮助文档

docker 具体命令--help

镜像命令操作

查看本地所有镜像

docker images
-a 列举出历史镜像
-q 只显示镜像ID 

查询镜像

docker search 镜像名称
--limit  前几个,例: docker search --limit 5 redis

在这里插入图片描述

拉取镜像

docker pull 镜像名称
:版本号  获取制定版本镜像,例:docker pull redis:6.0.8

查看占用空间

docker system df

删除镜像

docker rmi 镜像名字或ID
-f 强制删除
删除多个直接空格拼接,例:docker rmi a b c
删除全部(慎重 ) docker rmi $(docker images -qa)

虚悬镜像
仓库名和标签都为none的镜像,由docker拉取错误产生,最好删除

容器命令操作

交互式启动

docker runt -it 镜像

退出终端

exit 终止容器
ctrl+p+q  退出控制,不关闭容器

查看容器

docker ps
-a 罗列出所有容器包含历史的
-l 最近创建的
-n 数字 展示最近数字个记录
-q 只展示容器编码

启动已停止的容器

docker start 容器id

重启容器

docker restart 容器id

停止容器

docker stop 容器id

强制停止容器

docker kill 容器id

删除已停止容器

docker rm 容器id
-f 强制删除未停止的 

一次性删除多个

 docker rm -f $(docker ps -a -q)
 docker ps -a -q | xargs docker rm

重要

启动守护容器(后台服务器)

docker run -d 容器id或名称

#使用镜像centos:latest以后台模式启动一个容器
docker run-d centos

问题:然后docker ps-a进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行, 就必须有一个前台进程.
容器运行的命令如果不是那些 一直挂起的命令 (比如运行top, tail) , 就是会自动退出的。

这个是docker的机制问题, 比如你的web容器, 我们以ng in x为例, 正常情况下, 我们配置启动服务只需要启动响应的service即可。例如service ng in x start 但是, 这样做, ng in x为后台进程模式运行, 就导致docker前台没有运行的应用, 这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.
所以,最佳的解决方案是, 将你要运行的程序以前台进程的形式运行, 常见就是命令行模式,表示我还有交互操作,别中断

查看日志

docker logs 容器id

查看容器内进程

docker top 容器id

查看容器内部细节

docker inspect 容器id 

重新进入交互窗口

docker exec -it 容器id /bin/bash

或
docker attach 容器id /bin/bash

二者区别

  • attach直接进入容器启动命令的终端, 不会启动新的进程 用exit退出, 会导致容器的停止。
  • (推荐使用)exec是在容器中打开新的终端, 并且可以启动新的进程 用exit退出, 不会导致容器的停止。

拷贝容器文件到主机

docker cp 容器id:容器内文件地址 主机目标地址 ,例:
docker cp ba1f715c633f:/test/aaa.txt /test/c.txt

将容器导出

docker export 容器ID > 文件名.tar

将tar文件添加到镜像

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

docker推送镜像至阿里云

案例演示:

step1: docker运行ubuntu,发现并没有vim工能

在这里插入图片描述

step2: 安装vim功能

# 先更新包管理工具
apt-get update
# 然后安装vim
apt-get install vim

step3: commit镜像

docker commit -m="提交的描述信息"-a="作者" 容器ID 要创建的目标镜像名:[标签名] 
例:
docker commit -m="add ifconfig" -a="sea" 1a2fd53ce247 sea/ubuntu/ifconfig:1.0

在这里插入图片描述

step4: 阿里云中创建命名空间及仓库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行步骤
在这里插入图片描述

docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sea-repository/repository1.0:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/sea-repository/repository1.0:[镜像版本号]

在这里插入图片描述

docker构建私有仓库

1. 下载镜像Docker Registry

docker pull registry

2. 运行私有库Registry, 相当于本地有个私有Docker hub

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

3.案例演示创建一个新镜像, ubuntu安装ifconfig命令

apt-get update
apt-get install net-tools
## 验证
ifconfig
## 生成镜像 
docker commit -m="add ifconfig" -a="sea" 1a2fd53ce247 sea/ubuntu/ifconfig:1.0

4.curl验证私服库上有什么镜像区

curl -XGET http://192.168.159.3:5000/v2/_catalog

5.将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
公式: docker tag 镜像:Tag Host:Port/Repository:Tag

docker tag sea/ubuntu/ifconfig:1.0 192.168.159.3:5000/sea/ubuntu/ifconfig:1.0

6.修改配置文件使之支持http
修改/etc/docker/daemon.json, 添加如下json

"insecure-registries":["192.168.159.3:5000"]

在这里插入图片描述
重启docker,运行registry
7.push推送到私服库

docker push 符合格式的镜像名称:TAG 

8.curl验证私服库上有什么镜像2

curl -XGET http://192.168.159.3:5000/v2/_catalog

在这里插入图片描述

9.pull到本地并运行

docker pull 192.168.159.3:5000/sea/ubuntu/ifconfig:1.0

在这里插入图片描述

docker容器数据卷

数据卷的作用为持久化重要资料backup, 映射容器内的数据备份+持久化到本地主机目录。

卷就是目录或文件, 存在于一个或多个容器中, 由docker挂载到容器, 但不属于联合文件系统, 因此能够绕过Union FileSystem提供 一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化, 完全独立于容器的生存周期, 因此Docker不会在容器删除时删除其挂载的数据卷

作用
将运用与运行的环境打包镜像, run后形成容器实例运行, 但是我们 ]对数据的要求希望是持久化的

Docker容器产生的数据, 如果不备份, 那么当容器实例删除后, 容器 内的数据自然也就没有了。 为了能保存数据在docker中我们使用卷。

特点:
1: 数据卷可在容器之间共享或重用数据
2: 卷中的更改可以直接实时生效,爽
3: 数据卷中的更改不会包含在镜像的更新中
4: 数据卷的生命周期一直持续到没有容器使用它为止

docker容器卷实例

运行命令:

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
例:
docker run -it --privileged=true -v /docker/container/share:/docker/container/share --name="u1" seaubuntu:1.0

查看容器

docker inspect

在这里插入图片描述
只读情况(只限制容器)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
默认是rw(可读可写)

docker容器卷的继承

实现多容器间与宿主机之间的数据共享,一主多从

docker run -it --privileged=true --volumes-from u1 --name u2 seaubuntu:1.0

在这里插入图片描述

常见软件安装

tomcat

拉取下载
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行

docker run -d -p 8080:8080 --name ti tomcat

进入tomcat

docker exec -it b841bd497437 /bin/bash

新版tomcat需要删除webapps,并将webapps.dist变更为webapps
在这里插入图片描述

rm -r webapps
mv webapps.dist webapps

访问tomcat在这里插入图片描述

使用非最新版,省去修改webapps步骤

docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8 

mysql

简单版

注意:navicat连接docker上mysql创建的新用户可能会报1045密码错误
解决方法:

grant all privileges on *.* to 'zhy'@'%' identified by '123456' with grant option;
flush privileges;

下载

docker pull mysql:5.7

运行

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

mysql测试
在这里插入图片描述

navicat链接测试
链接不上注意关闭linux防火墙,关闭方法
在这里插入图片描述
常见问题

  • docker中mysql编码问题,docker默认编码为latin1,产生中文乱码
SHOW VARIABLES LIKE 'character%';

在这里插入图片描述

  • 容器直接被强制删除,数据库数据直接消失

实战版

使用容器卷启动,解决容器终止数据消失问题

docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/log:/var/log/mysql  -v /docker/mysql/data:/var/lib/mysql  -v /docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

编码配置:
修改linux下/docker/mysql/conf下my.cnf文件,内容如下

[client] 
default_character_set=utf8 
[mysqld] 
collation_server = utf8_general_ci 
character_set_server = utf8

重启mysql查看编码:
在这里插入图片描述

集群

Step1: 启动mysql主机

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

Step2: 在主机配置文件容器卷位置创建my.cnf插入内容

cd /docker/mysql/mysql-master
touch 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, state men, row) 
binlog_format=mixed 
##二进制日志过期清理时间。默认值为0,表示不自动清理。 
expire_logs_days=7 
##跳过主从复制中遇到的所有错误或指定类型的错误, 避免slave端复制中断。 
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 
slave_skip_errors=1062

Step3: master容器实例内创建数据同步用户

# 重启mysql-master
docker restart mysql-master

连接数据库执sql行命,创建同步数据用户

-- 创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
-- 授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

Step4: 启动mysql从机

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

Step5: 在主机配置文件容器卷位置创建my.cnf插入内容,完成后重启从机

cd /docker/mysql/mysql-slave
touch 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

Step6: 主机输入sql命令,记录数据

show master STATUS; 

在这里插入图片描述

Step7: 从机执行sql命令,配制主从复制

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

参数解析:

master_host: 主数据库的IP地址;
master_port: 主数据库的运行端口;
master_user: 在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件, 通过查看主数据的 状态, 获取File参数; master_log_pos: 指定从数据库从哪个位置开始复制数据,通过查看主数拥 居的状态, 获取Position参数;
master_connect_retry: 连接失败重试的时间间隔,单位为秒。

Step8 : 从机查看主从复制执行状态

show slave status \G;   --\G 为竖型展示

在这里插入图片描述

Step9: 从机启动中从复制

start slave;

在这里插入图片描述

redis

单机版

Step1: 添加redis.conf到指定容器卷目录,并修改
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Step2: 运行启动命令

docker run -p 6379:6379 --name myr3 --privileged=true -v /docker/redis/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

验证执行的为容器卷内配制文件
修改配制文件 databases
在这里插入图片描述

select 查询验证
在这里插入图片描述

redis集群

redis集群搭建及信息查看

Step1: 启动6台redis容器

docker run -d --name redis-node-1 --net host --privileged=true -v /docker/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 /docker/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 /docker/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 /docker/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 /docker/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 /docker/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

参数说明:

docker run // 创建并运行docker容器实例
–name red is-node-6 // 容器名字
–net host // 使用宿主机的IP和端口,默认
–privileged=true // 获取宿主机root用户权限
-v/data/red is/share/redis-node-6:/data // 容器卷, 宿主机地址:docker内部地址
redis:6.0.8 // redis镜像和版本号
–cluster-enabled yes // 开启redis集群
–appendonly yes // 开启持久化
–port 6386 // redis端口号

在这里插入图片描述

Step2: 进入随意redis,执行命令

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

参数说明:

–cluster-replicas 1 // 表示每个master创建一个slave节点

在这里插入图片描述
Step3:连接6381,查看信息

redis-cli -p 6381
cluster info

在这里插入图片描述

cluster nodes

在这里插入图片描述

Step4:单价版插入数据报错
在这里插入图片描述
原因为k1键的哈希值超过6381机器所分配槽位

采用集群方式连接

redis-cli -p 6381 -c

在这里插入图片描述

Step5:查看集群状态

redis-cli --cluster check 192.168.159.3:6381

在这里插入图片描述

redis集群扩容

扩容要求:
要将原有的三主三从集群扩容为四主四从

Step1: 创建两个新的redis容器(6387, 6388)

docker run -d --name redis-node-7 --net host --privileged=true -v /docker/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 /docker/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

Step2: 进入到6387,执行命令,将6387加入到集群

将新增的6387作为master节点加入集群
redis-cli --cluste add-node 自己实际IP地址: 6387 自己实际IP地址: 6381
6387就是将要作为master新增节点
6381就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

redis-cli --cluster add-node 192.168.159.3:6387 192.168.159.3:6381

在这里插入图片描述
Step3: 分配槽号

redis-cli --cluster reshard 192.168.159.3:6381

在这里插入图片描述
查看分配完槽位情况:

在这里插入图片描述
由此可以看出6387的槽位是有前面三个redis分别提取一部分槽位给它的,而不是从新分配槽位。
原因是从新分配的成本太高。

Step3: 将6388设为6387的从节点

redis-cli --cluster add-node 192.168.159.3:6388 192.168.159.3:6387 --cluster-slave --cluster-master-id cb87c7696108947339c1b13b8953392fa6603da2

在这里插入图片描述

redis集群缩容

减少redis集群机器个数,将四主四从缩减为三主三从

Step1: 首先删除从节点

redis-cli --cluster del-node 192.168.159.3:6388 416e87204c821744403d0d3de71d2922487e37b9

Step2: 将6387的槽号全部给6381,从新分配

redis-cli --cluster reshard 192.168.159.3:6381

在这里插入图片描述

Step3: 删除6387

redis-cli --cluster del-node 192.168.159.3:6387 cb87c7696108947339c1b13b8953392fa6603da2

在这里插入图片描述

rabbitmq

下载镜像

docker pull rabbitmq

运行容器

docker run -d --name rabbitmq_lc -p 15672:15672 -p 5672:5672 rabbitmq

进入容器

docker exec -it rabbitmq_lc /bin/bash

运行

rabbitmq-plugins enable rabbitmq_management

DockerFile

DockerFile概要

DockerFile是用来构建Docker镜像的文本 文件,是由一条条构建镜像所需的指令和参数构成的脚本。
在这里插入图片描述

构建三步骤

  1. 编写DockerFile文件
  2. docker build命令构建镜像
  3. docker run依照镜像运行容器实例

docker执行DockerFile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行DockerFile中的下一条指令直到所有指令都执行完成

基础语法

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

DockerFile、docker镜像、docker容器关系

从应用软件的角度来看, Docker file、Docker镜像与Docker容器分别代表软件的三个不同阶段

  • Docker file是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件镜像的运行态, 也即依照镜像运行的容器实例

Docker file面向开发, Docker镜像成为交付标准, Docker容器则涉及部署与运维, 三者缺一不可, 合力充当Docker体系的基石。

DockerFile常用字

在这里插入图片描述

FROM

基础镜像, 当前新镜像是基于哪个镜像的, 指定一个已经存在的镜像作为模板, 第一条必须是FROM

MAINTAINER

镜像维护者的姓名和邮箱地址

EXPOSE

容器对外暴露的端口号

WORKDIR

指定在创建容器后,终端默认登录进来的工作目录,一个落脚点

USER

指定该镜像以什么样的用户去执行,如果不指定,默认是root

ENV

用来在构建镜像过程中设置环境变量,即定义常量,可被 $+定义值 引用

VOLUME

容器数据卷,用于数据报错和持久化工作

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY

与ADD相同

CMD

指定容器启动后要干的事情

注意:如果docker run后边有参数,则CMD将会失效

和RUN的区别:

  • CMD是在docker run时运行
  • RUN是在docker bulid时运行

ENTRYPOINT

类似于CMD, 但比CMD更厉害,它的命令不会被docker run后边参数影响
如果与CMD,共同使用,则CMD将会变成ENTRYPOINT中的一个参数,注意:如果这时docker run有参数,则CMD中值被替换
在这里插入图片描述

实战演练

目的:
docker下载centos镜像,此时不包含vim、ifconfig、java等功能;
将centos通过DockerFile生成一个包含vim、ifconfig、java的镜像

Step1: 将jdk安装包与放到指定目录,并在同级目录下创建Dockerfile文件
编写Dockerfile:

FROM centos:7
MAINTAINER zhy<15010071819@163.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-8u192-linux-x 64.tar.gz添加到容器中, 安装包必须要和Docker file文件在同一位置 
ADD jdk-8u192-linux-x64.tar.gz /usr/local/java/
 
#配置java环境变量 
ENV JAVA_HOME /usr/local/java/jdk1.8.0_192 
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

Step2: 启动Dockerfile

docker build -t centosjava8:1.5 .

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

docker解决问题案例

1-2亿条数据需要缓存,存储案例设计

哈希取余分区(易)

在这里插入图片描述

2亿条记录就是2亿个k,v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式: hash(key) %N个机器台数, 计算出哈希值, 用来决定数据映射到哪一个节点上。

优点: 简单粗暴, 直接有效, 只需要预估好数据规划好节点, 例如3台、8台、10台, 就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请 求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。

缺点: 原来规划好的节点,进行扩容或者缩容就比较麻烦了额,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个 数固定不变时没有问题, 如果需要弹性扩容或故障停机的情况下, 原来的取模公式就会发生变化:Hash(key) /3会变成Hash(key) /?。此时地址经过 取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。某个red is机器宕机了, 由于台数数量变化, 会导致hash取余全部数据重新洗牌。

一致性哈希算法分区(一般)

一致性Hash算法背景:
一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决分布式缓存数据变动和映射问题某个机器宕机了,分母数量改变了,自然取余数不OK了

一致性哈希环
一致性哈希环 一致性哈希算法必然有个hash函数并按照算法产生hash值, 这个算法的所有可能哈希值会构成一个全量集, 这个集合可以成为一个hash空间 [0,2^32-1] ,这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0=2^32),这样让它逻辑上形成了一个环形空间。

它也是按照使用取模的方法, 前面笔记介绍的节点取模法是对节点(服务器) 的数量进行取模。而一致性Hash算法是对2^32取模, 简单来说, 一 致性Hash算法将整个哈希值空间组织成一个虚拟的圆环, 如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形) , 整个哈希环 如下图:整个空间按顺时针方向组织,圆环的正上方的点代表0,“0点右侧的第一个点代表1,以此类推,2、3、4、……直到2^32-1,也就是说0点左 侧的第一个点代表2^32-1, 0和2^32-1在零点中方向重合, 我们把这个由2^32个点组成的圆环称为Hash环。
在这里插入图片描述

节点映射
将集群中各个IP节点映射到环上的某一个位置。 将各个服务器使用Hash进行一个哈希, 具体可以选择服务器的IP或主机名作为关键字进行哈希, 这样每台机器就能确定其在哈希环上的位置。假如 4个节点Node A、B、C、D, 经过IP地址的哈希函数计算(hash(ip) ) , 使用IP地址哈希后在环空间的位置如下:
在这里插入图片描述

落键规则
当我们需要存储一个kv键值对时, 首先计算key的hash值, hash(key) , 将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置, 从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。 如我们有Object A、Object B、Object C、Object D四个数据对象, 经过哈希计算后, 在环空间上的位置如下:根据一致性Hash算法, 数据A会被定 为到Node A上, B被定为到Node B上, C被定为到No deC上, D被定为到NodeD上。
在这里插入图片描述
优点
容错性
假设No deC宕机, 可以看到此时对象A、B、D不会受到影响, 只有C对象被重定位到NodeD。一般的, 在一致性Hash算法中, 如果一台服务器不可 用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。简单 说,就是C挂了,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。

扩展性
数据量增加了, 需要增加一台节点Node X, X的位置在A和B之间, 那收到影响的也就是A到X之间的数据, 重新把A到X的数据录入到X上即可, 不会导致hash取余全部数据重新洗牌。
在这里插入图片描述
缺点
Hash环数据倾斜问题:
一致性Hash算法在服务节点太少时, 容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上) 问题, 例如系统中只有两台服务器:
在这里插入图片描述

哈希槽分区(复杂)

出现原因

  • 解决一致性哈希算法数据倾斜问题
  • 哈希槽实质就是一个数组,数组 [0,2^14-1] 形成的hash slot空间

能干什么
解决均匀分配的问题,在数据和节点之间又加入了一层, 把这层称为哈希槽(slot) , 用于管理数据和节点之间的关系, 现在就相当于节点上放的是 槽,槽里放的是数据。
在这里插入图片描述
槽解决的是粒度问题,相当于把粒度变大了,这样便于数 据移动。
哈希解决的是映射问题, 使用key的哈希值来计算所在的 槽,便于数据分配。

多少个hash槽
一个集群只能有16384个槽,编号0-16383(0-214-1) 这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给 哪个主节点。集群会记录节点和槽的对应关系。解决了节 节点和槽的关系后, 接下来就需要对key求哈希值, 然后对16384取余, 余数是几key就落入对 应的槽里。slot=CRC16(key) %16384。以槽为单位移 动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

实现原理
Redis集群中内置了16384个哈希槽, red is会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在Red is集群中放置一个key-value时 , redis先对key使用crc16算法算出一个结果, 然后把结果对16384求余数, 这样每个key都会对应一个编号在0-16383之间的哈希槽, 也就是 映射到某个节点上。如下代码, key之A、B在Node2, key之C落在Node3上。
在这里插入图片描述

在这里插入图片描述

3主3从redis集群搭建(见:常见软件安装 - redis - redis集群搭建及信查看)

docker运行微服务

Step1: 生成一个测试微服务jar包, 复制到linux服务下
在这里插入图片描述

Step2: 生成Dockerfile文件,内容如下

#基础镜像使用java 
FROM java:8 

#作者 
MAINTAINER zhy 

#VOLUME指定临时文件目录为/tmp, 在主机/var/lib/docker 目录下创建了一个临时文件并链接到容器的/tmp 
VOLUME /tmp 

#将jar包添加到容器中并更名为zzyy_docker jar 
ADD user-center-0.0.1-SNAPSHOT.jar user-center-0.0.1-docker.jar 

#运行jar包 
RUN bash -c 'touch /user-center-0.0.1-docker.jar' 
ENTRYPOINT ["java","-jar","/user-center-0.0.1-docker.jar"] 

#暴露6001端口作为微服务 
EXPOSE 8094

Step3: 打包镜像文件

docker build -t user-center-0.1-docker:1.6 .

Step4: 启动容器

docker run -d -p 8094:8094 c683d48667ea

验证
在这里插入图片描述

docker网络

Docker服务默认会创建一个docker 0网桥(其上有一个docker O内部接口) , 该桥接网络的名称为docker 0, 它在内核层连通了其他的物理或虚拟网卡, 这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker O接口的IP地址和子网掩码, 让主机和容器之间可以通过网 桥相互通信
在这里插入图片描述

docker network操作命令

在这里插入图片描述

作用

docker网管理和容器调用之间的规划

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响,因为docker容器的ip是会变动的。

docker的网络模式

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

bridge

启动命令:

默认就为bridge
docker run -d -p 8081:8080 --name tomcat01 billygoo/tomcat89-jdk8
  1. Docker使用Linux桥接, 在宿主机虚拟一个Docker容器网桥(docker 0) , Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址, 称为Container-IP, 同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥, 这样容器之间就能够通过容器的 Container-IP直接通信。
  2. docker run的时候, 没有指定network的话默认使用的网桥模式就是bridge, 使用的就是docker 0。在宿主机ifconfig, 就可以看到docker 0和自己 create的network(后面讲) eth 0, eth 1, eth 2……代表网卡一, 网卡二, 网卡三……, l代表127.0.0.1, 即localhost, inet addr用来表示网卡的IP地址
  3. 网桥docker0创建一对对等虚拟设备接口,一个交veth,另一个交eht0,成对匹配。
    3.1 整个宿主机的网桥模式都是docker O, 类似一个交换机有一堆接口, 每个接口叫vet h, 在本地主机和容器内分别创建一个虚拟接口, 并让他们彼 此联通(这样一对接口叫vet hp air) ;
    3.2 每个容器实例内部也有一块网卡, 每个接口叫eth 0;
    3.3 docker 0上面的每个vet h匹配某个容器实例内部的eth 0, 两两配对, 一一匹配。 通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是 互通的。

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

host

启动命令:

docker run -d -p 8082:8080 --name --network02 host tomcat01 billygoo/tomcat89-jdk8

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的 IP和端口。

none

启动命令:

docker run -d -p 8083:8080 --name --network02 none tomcat03 billygoo/tomcat89-jdk8

在none模式下, 并不为Docker容器进行任何网络配置。 也就是说, 这个Docker容器没有网卡、IP、路由等信息, 只有一个lo,需要我们自己为Docker容器添加网卡、I配置IP等。

在这里插入图片描述

container

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的 容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

在这里插入图片描述

演示
由于tomcat启动都用8080端口,导致无法使用container网络类型。顾演示采用alpine(一个小巧的linux)
Step1: 启动一个alpine

docker run -it --name alpine alpine /bin/sh

Step2: 启动第二个alpine, 与第一个alpine桥接

docker run -it --name alpine02 --network container:alpine alpine /bin/sh

在这里插入图片描述

注意: 当alpine停掉了,alpine02的网络也会中断

自定义网络

没有用自定义网络前

创建两个tomcat容器,t1、t2,查看其ip
在这里插入图片描述
分别进入到两个容器,并且相互pig对方的ip,发现是可以ping同的
在这里插入图片描述
在这里插入图片描述
但是ping对方的名称却报错
在这里插入图片描述

这样是不合理的,由于docker容器的IP是会变动的,所以需设计优化

使用自定义网络

Step1: 创建网络

docker netword create zhy_network

Step2: 启动两个tomcat,并且使用自定义网络

docker run -it -p 8081:8080 --name t1 --network zhy_network 30ef4019761d bash
docker run -it -p 8082:8080 --name t2 --network zhy_network 30ef4019761d bash

这时发现可以通过容器名称ping通

在这里插入图片描述

compose

ComposeDocker公司推出的一个工具软件, 可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件 docker-compose.yml写好多个容器之间的调用关系。然后, 只要一个命令, 就能同时启动/关闭这些容器。

查看compse信息

docker compose version

在这里插入图片描述

作用

docker建议我们每一个容器中只运行一个服务, 因为docker容器本身占用资源极少, 所以最好是将每个服务单独的分割开来但是这样我们又面临了一个 问题?

如果我需要同时部署好多个服务, , 难道要每个服务单独写Docker file然后在构建镜像, 构建容器, 这样累都累死了, 所以docker官方给我们提供了 docker-compose多服务部署的工具

例如要实现一个Web微服务项目, 除了Web服务容器本身, 往往还需要再加上后端的数据库mysql服务容器, red is服务器, 注册中心eureka, 甚至 还包括负载均衡容器等等。。。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式) 来定义一组相关联的应用容器为一个项目(project) 。

可以很容易地用一个配置文件定义一个多容器的应用, 然后使用一条指令安装这个应用的所有依赖, 完成构建。Docker-Compose解决了容器与容 器之间如何管理编排的问题。

核心概念

一个文件、两个要素

一个文件

docker-compse.yml

两个要素

服务:
一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、ngin容器或者redis容器。

工程:
由一组关联的应用容器组成的一个完整业务单元, 在docker-compose.yml文件中定义。

三个步骤

  1. 编写Docker file定义各个微服务应用并构建出对应的镜像文件 。
  2. 使用docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
  3. 最后, 执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线 。

compse常用命令

命令描述
docker-compose-h查看帮助
docker-compose ip启动所有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查看容器输出日志
dokcer-compose config检查配置
dokcer-compose config -q检查配置, 有问题才有输出
docker-compose restart重启服务
docker-compose start启动服务
docker-compose stop停止服务

实例

在含有Dockerfile的目录下,新建docker-compose.yml文件,编辑内容如下:


version: "3"

services:
        microService:
                image: user-center-0.1-docker:1.6
                container_name: ms01
                ports:
                        - "8094:8094"
                volumes:
                        - /docker/app/microService:/data
                networks:
                        - app_net
                depends_on:
                        - redis
                        - mysql

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

        mysql:
                image: mysql:5.7
                environment:
                        MYSQL_ROOT_PASSWORD: '123456'
                        MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
                        MYSQL_DATABASE: 'db01'
                        MYSQL_USER: 'zhy'
                        MYSQL_PASSWORD: '123456'
                ports:
                        - "3306:3306"
                volumes:
                        - /docker/app/mysql/db:/var/lib/mysql
                        - /docker/app/mysql/conf/my.cnf:/etc/my.cnf
                        - /docker/app/mysql/init:/docker-entrypoint-initdb.d
                networks:
                        - app_net
                command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
        app_net:

修改项目mysql及redis地址
在这里插入图片描述
从新打包上传到centos, 并生成镜像

docker build -t user-center-0.1-docker:1.6 .

执行命令启动compose

docker compose up

验证
在这里插入图片描述

Portainer(轻量级可视化及监控)

Portainer是一款轻量级的应用, 它提供了图形化界面, 用于方便地管理Docker环境, 包括单机环境和集群环境。

安装

使用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

在这里插入图片描述

访问:http://192.168.159.3:9000/#/init/admin

在这里插入图片描述

CIG(重量级监控三剑客)

CAdvisor监控收集 + InfluxDB存储数据 + Granfana展示图表
在这里插入图片描述

通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU, 内存以及网络流量等数据, 一般小公司够用了。。

但是, docker stats统计结果只能是当前宿主机的全部容器, 数据资料是实时的, 没有地方存储、没有健康指标过线预警等功能

CAdvisor

CAdvisor是一个容器资源监控工具, 包括容器的内存, CPU, 网络IO, 磁盘IO等监控, 同时提供了一个 WEB页面用于查看容器的实时运行状态。C Advisor默认存储2分钟的数据, 而且只是针对单物理机。 不过, CAdvisor提供了很多数据集成接口, 支持Influx DB, Red is, Kafka, Elastic search等集成, 可以加 上对应配置将监控数据发往这些数据库存储起来。

CAdvisor功能主要有两点:

  • 展示Host和容器两个层次的监控数据。
  • 展示历史变化数据。

InfluxDB

InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库, 无需外部依赖。

CAdvisor默认只在本机保存最近2分钟的数据, 为了持久化存储数据和统一收集展示监控 数据, 需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库, 专门用于存储时序相关数据, 很 适合存储C Advisor的数据。而且, C Advisor本身已经提供了InfluxDB的集成方法, 丰启动容器时指定配置即可。

InfluxDB主要功能:

  • 基于时间序列,支持与时间有关的相关函数(如最大、最小、求和等);
  • 可度量性:你可以实时对大量数据进行计算;
  • 基于事件:它支持任意的事件数据;

Granfan

Granfan是一个开源的数据监控分析可视化平台, 支持多种数据源配置(支持的 ]数据源包括 Influx DB, MySQL, Elastic search, Open TS DB, Graphite等) 和丰富的插件及模 板功能,支持图表权限控 制和报警。

Graf an主要特性:

  • 灵活丰富的图形化选项
  • 可以混合多种风格
  • 支持白天和夜间模式
  • 多个数据源

启动

编写docker-compos.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 
		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_USER=root
			- INFLUXDB_PASS=root
	

docker-compos.yml目录下启动

docker compose up

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

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

使用

登录Grafana,账号密码: admin / admin
添加数据库
在这里插入图片描述
在这里插入图片描述
下滑填写Database, 账号密码: root / root,然后保存
在这里插入图片描述
新建监控盘

在这里插入图片描述
选择监控内容,以及设置监控标题及描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值