docker-compose搭建prometheus+node-exporter+grafana+alertManager+cadvisor监控体系实战

一:docker简介

1,什么是docker

        Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护。Docker自开源后受到广范的关注和讨论,以至于dotCloud公司后来都改名为Docker Inc。RedHat已经在其RHEL6.5中集中支持Docker;Google也在其PaaS产品中广泛应用。Docker的目标是实现经量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要关心容器的管理,使得操作更加简单。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。

        下图比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现的虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层现实现

 

 

 

 


2docker的设计思想

        Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

总之docker就是集装箱原理。

 


3,为什么要使用docker

        作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。

传统虚拟机方式运行10 个不同的应用就要起10 个虚拟机,而Docker 只需要启动10 个隔离的应用即可。具体说来,Docker 在如下几个方面具有较大的优势。

1,更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间.

2,更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器

等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

3,更简单的管理

使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。对比虚拟机

 

 

 

 


3docker的局限性

  1. Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
  2. LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
  3. 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
  4. 网络管理相对简单,主要是基于namespace隔离
  5. cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
  6. Docker对disk的管理比较有限
  7. container随着用户进程的停止而销毁,container中的log等用户数据不便收集

4docker在开发、测试、部署中的定位

1,尝试新软件

对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵,正是得益于 Docker,让我们有

可能在一条或者几条命令内就搭建完环境。Docker 有一个傻瓜化的获取软件的方法,Docker 后台会自动获得环境镜像并且运行环境。

并不仅仅是新技术环境搭建用得到 Docker。如果你想快速在你的笔记本上运行一个 MySQL 数据库,或者一个 Redis 消息队列,那么使用 Docker 便可以非常容易地做到。例如 Docker 只需要一条命令便可以运行 MySQL 数据库:docker run -d -p 3306:3306 tutum/mysql。

2,进行演示

工作中自己开发的成果对客户或者别人做一两个演示。搭建演示环境的过程非常麻烦。Docker是演示这些工具的最合理的方式。同时,对于客户来说,可以直接将 Docker 镜像提供给他们,而不必去做任何环境配置的工作,工作的效果也会和在他们演示中所看到的一模一样,同时不必担心他们的环境配置会导致我们的产品无法运行。

3,避免我机器上可以运行

无论是上一篇介绍的企业部署 Docker 还是本文的个人 Docker 用例,都提到了这个情况。因为环境配置不同,很多人在开发中也会遇到这个情况,甚至开发的软件到了测试人员的机器上便不能运行。但这都不是重点。重点是,如果我们有一个可靠的、可分发的标准开发环境,那么我们的开发将不会像现在这么痛苦。Docker 便可以解决这个问题。Docker 镜像并不会因为环境的变化而不能运行,也不会在不同的电脑上有不同的运行结果。可以给测试人员提交含有应用的 Docker 镜像,这样便不再会发生“在我机器上是可以运行的”这种事情,很大程度上减轻了开发人员测试人员互相检查机器环境设置带来的时间成本。

4,更好地利用资源

虚拟机的粒度是“虚拟出的机器”,而 Docker 的粒度则是“被限制的应用”,相比较而言 Docker 的内存占用更少,更加轻量级。对我来说这是 Docker 的一个优势:因为在如果在电脑中运行多个 Docker 应用,使用 Docker 比使用虚拟机更加简单,方便,粒度更细,也能持续地跟踪容器状态。

5,为微服务定制

我们一直在讲“微服务(Microservices)”的概念。Docker 可以很好地和微服务结合起来。从概念上来说,一个微服务便是一个提供一整套应用程序的部分功能,Docker 便可以在开发、测试和部署过程中一直充当微服务的容器。甚至生产环境也可以在 Docker 中部署微服务。

6,在云服务提供商之间移植

大多数的云主机提供商已经全面支持 Docker。对于开发人员来说,这表示你可以很方便地切换云服务提供商,当然也可以很方便地将你本地的开发环境移动到云主机上,不需要本地上配置一次运行环境、在云主机上还配置一次运行环境。全面部署 Docker (Docker here and Docker there) 作为标准运行环境可以极大地减轻应用上线时的工作量和产生 BUG。

7,技术的创新

Docker 正在快速发展,工具也在不断更新,没有人能预见到未来 Docker 会是什么样子的。你在复杂的系统中 Docker 使用的越多,越是可能会发现技术上的空白和未来技术发展的方向。现在还处在 Docker 的发展期,任何你使用 Docker 创建的工具都有可能成为社区关注的热点。这是 Docker 的机会,也是成就你自己的机会。

二:docker和虚拟技术比较

1,之前的虚拟技术

虚拟机(virtual machine)就是带环境安装的一种解决方案。

它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。  

 

虚拟机的缺点:

1 资源占用多 2 冗余步骤多 3 启动慢


2,docker容器化技术

    由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

 

比较了 Docker 和传统虚拟化方式的不同之处:

*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;

*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

* 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。


3,开发和运维的春天

容器技术特点:一次构建,到处运行

1,更快的应用交付和部署。传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

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

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

4,更高效的计算资源利用。 Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。


4,企业级应用

新浪

 

 

 

 

 

 

 

 

 

美团

 

等等………………

三:docker下载

1,Docker 下载

1,官网 http://www.docker.com

2,中文官网 https://docker-cn.com

3,仓库  https://hub.docker.com


2,Docker 安装前提说明

2.1 CentOS Docker 安装

Docker支持以下的CentOS版本:

CentOS 7 (64-bit)

CentOS 6.5 (64-bit) 或更高的版本

2.2 前提条件

目前,CentOS 仅发行版本中的内核支持 Docker。

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。[我们基于7以上的版本来讲的哦]

Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本[。

2.3 查看自己的内核

uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

uname -r 

版本OK木有问题

注意在centos6.5下面也可以安装。但是有点麻烦。想装的可以自己去查资源


3,Docker 的基本组成

 

四:docker安装

1,centos 下安装Docker 文档

https://docs.docker.com/install/linux/docker-ce/centos/

2,Docker 安装

2.1,确定是centos7的版本

 

2.2,yum安装gcc相关

1,确定centos7能上外网
2,yum -y install gcc
3,yum -y install gcc-c++

2.3,卸载旧版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.4,安装方法

yum install docker

2.5,启动docker

systemctl start docker

2.6,查看版本

docker version

2.7,测试运行 hello-world

 

docker run hello-world

由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。 

2.8,测试运行nginx

 

docker run -p 8080:80 -d docker.io/nginx   //将80端口映射为8080,或者80:80还是原先的80端口,不可以不写。

测试

http://192.168.15.134:8080/

 

2.9,卸载docker

systemctl stop docker
yum -y remover docker
rm -rf /var/lib/docker

命令说明

docker images   列表当前docker引擎里面所有镜像

docker run -p 8080:80 -d docker.io/nginx

run :运行  ---à变成容器

-p 端口映射

8080:80    8080 代表宿主机的对外暴露的端口   80代表容器里面的nginx服务器使用的端口

-d 代表后台运行

docker.io/nginx 代表要运行哪一个镜像  可以改成nginx [从dockerhub里面下载最新的镜像]  也可以改成镜像ID

 

五:docker加速配置

1,阿里云镜像加速

1.登录:https://dev.aliyun.com/search.html

2.登录阿里云 搜索   容器镜像服务  找到后如下图

 

 

 

 

 

 

 

2,下载其它镜像

如tomcat

 

 

 

 

 

 docker pull tomcat:8.5

3,docker镜像的相关常用命令

5.1 列出所有镜像

docker images 

5.2 根据镜像id删除镜像

docker rmi 镜像id 

 ...

六:docker底层原理

1,Docker是如何工作的

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。

 

 

 

 


2,docker run了什么

 

七:docker命令[帮助+镜像]

1,帮助命令

docker version 查看docker版本
docker info 显示全系统信息
docker --help 显示docker相关的所有命令及功能说明


2,镜像命令

2.1 docker images  列表本机上的镜像

 

REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

docker images -[options]的说明

 

-a 列表本地的所有镜像及子镜像
-q 只显示镜像ID
--digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息

2.2 docker seach 镜像搜索命令

搜索网站:https://hub.docker.com

语法

 

docker search 镜像名称

docker search 镜像名称  -[options]   说明

 

--no-trunc 显示完整的镜像描述
-s 列出收藏数不少于指定值的镜像
--automated 只列出 automated build类型的镜像

 


2.3 docker pull 镜像下载命令

语法

docker pull 镜像名称:[TAG]
例如:docker pull tomcat:8.5  下载8.5的镜像版本
     dokcer pull tomcat 默认下载最新的tomcat镜像版本 【latest】     

2.4 docker rim 镜像删除命令

删除单个   docker rmi -f 镜像ID
删除多个   docker rmi -f 镜像ID1 镜像ID2
           docker rim -f 镜像名:[tag]  镜像名:[tag]
删除全部
           docker rmi -f $(docker images -qa)

八:docker-compose实战案例

1、首先安装docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务

运行以下命令以下载 Docker Compose 的当前稳定版本(建议使用国内镜像下载):

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

将可执行权限应用于二进制文件:

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

创建软链:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

docker-compose --version

 2、docker-compose搭建prometheus+node-exporter+grafana+alertManager+cadvisor监控体系步骤说明(实战)

 2.1编写docker-compose.yaml

version: '2'

networks:
  monitor:
    driver: bridge

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    hostname: prometheus
    restart: always
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    networks:
      - monitor

  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    hostname: alertmanager
    restart: always
    ports:
      - "9093:9093"
    networks:
      - monitor

  grafana:
    image: grafana/grafana
    container_name: grafana
    hostname: grafana
    restart: always
    ports:
      - "3000:3000"
    networks:
      - monitor

  node-exporter:
    image: quay.io/prometheus/node-exporter
    container_name: node-exporter
    hostname: node-exporter
    restart: always
    ports:
      - "9100:9100"
    networks:
      - monitor

  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    hostname: cadvisor
    restart: always
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - "8899:8080"
    networks:
      - monitor

2.2、编写prometheus.yml配置文件

global:
  scrape_interval:     1s
  evaluation_interval: 1s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:  
      - targets: ['192.168.168.200:9090']
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['192.168.168.200:8899']
  - job_name: 'node'
    static_configs:
      - targets: ['192.168.168.200:9100']
  - job_name: 'austin'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.168.200:9100']

2.3、最后使用docker-compose up -d启动编写好的docker-compose.yaml(构建镜像,拉取镜像、(重新)创建服务,启动服务,并关联服务相关容器的一系列操作)

关闭容器命令:docker-compose down

 2.4:prometheus启动界面

2.5:node-exporter启动界面

2.6:grafana启动界面(默认账号密码:admin\admin)

2.7:alertManager启动界面

 

 

2.8:cadvisor启动界面

 

 

2.9、进到Grafana首页,配置prometheus作为数据源(DataSource)

 

 

 填写URL,点击Save&Test

 

 import相关监控的模板可以在 https://grafana.com/grafana/dashboards/ 这里查到,可以根据自己的需要选择不同的模板(服务器的监控直接选用:8919)

 

 选择prometheus

 

 

Springboot项目程序程序代码需要接入了actuator和prometheus
        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
        </dependency>

配置文件:application.properties

##################### monitor properties #####################
management.endpoint.health.show-details=always
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
management.endpoints.web.exposure.include=* 
management.metrics.export.prometheus.enabled=true
spring.boot.admin.client.url=http://localhost:9100
spring.boot.admin.client.instance.prefer-ip=true
 
需要在prometheus.yml配置下新增暴露的服务地址
  - job_name: 'projectName'
    metrics_path: '/actuator/prometheus' # 采集的路径
    static_configs:
    - targets: ['ip:port'] # todo 这里的ip和端口写自己的应用下的
893 模板来配置监控docker的信息
4701 模板的JVM监控

 

 

12900 模板SpringBoot监控

 

整合spring 官方监控工具 SpringBoot Admin

Spring Boot Admin为注册的应用程序提供以下功能:

  • 显示健康状况
  • 显示详细信息,例如JVM和内存指标micrometer.io指标数据源指标缓存指标
  • 显示内部编号
  • 关注并下载日志文件
  • 查看JVM系统和环境属性
  • 查看Spring Boot配置属性
  • 支持Spring Cloud的可发布/ env-&/ refresh-endpoint
  • 轻松的日志级别管理
  • 与JMX-beans交互
  • 查看线程转储
  • 查看http-traces
  • 查看审核事件
  • 查看http端点
  • 查看预定的任务
  • 查看和删除活动会话(使用spring-session)
  • 查看Flyway / Liquibase数据库迁移
  • 下载heapdump
  • 状态更改通知(通过电子邮件,Slack,Hipchat等)
  • 状态更改的事件日志(非持久性)

 

 

 

 

 

 
posted @ 2019-12-15 12:04  yiwanbin  阅读(1171)  评论(0编辑  收藏  举报