docker-compose介绍

docker-compose其实广义上理解是和k8s一样属于容器的编排工具,区别在于docker-compose用于单机上面基于提前定义好的docker编排yaml文件,在单机上可以一次性启动多个容器(当然你也可以定义多个容器的编排文件,启动多个)而k8s是把多台机器作为统一资源进行docker容器调度,以下为一个docker-compose容器编排文件的样例,相信有一些docker基础的同学一看就明白了

version: '2'
services: 
  dataservice:
    mysql:
      image:
      container_name:
      .....
    redis:
      image:
      container_name:
   appservice:
     springboot:
       image:
       container_name:

注意:image上面的不是容器名字,而是docker-compose中的service的概念,image下面的container_name才是容器名,docker-compose概念解释:

  • 一个docker-compose文件可以拥有多个service
  • 一个service可以拥有一个或者多个容器
  • container_name属于docker域

对于单机上面需要固定运行的容器编排,docker-compose非常方便

docker-compose安装

docker-compose安装很简单,docker- compose就是一个二进制文件,所以我们只需要下载并且放到系统的PATH环境变量目录下面即可

##下载docker-compose二进制文件,这里我们用rancher的开源资源站来下载(资源站只提供X86_64安装文件)
wget http://rancher-mirror.rancher.cn/docker-compose/v1.20.1/docker-compose-Linux-x86_64
##添加可执行权限
mv docker-compose-Linux-x86_64 docker-compose && chmod +x docker-compose
##移动至PATH目录
mv docker-compose /bin/docker-compose

docker安装这里不再介绍啦,在我的此篇博文有详细的docker离线以及在线安装步骤

k8s单master集群安装

开始搭建之前先来一张prometneus生态的官方架构图
在这里插入图片描述
说明:
prometheus不同于其他监控体系的地方在于它是主动去拉监控指标数据,而监控指标数据一般都是一些第三方基于prometheus提供的开发库开发的exporter进行采集并提供一个http端口把这些指标暴露出来,prometheus主动去配置的http端口基于配置的时间间隔去拉取监控指标数据(prometneus官方也提供了一些exporter,比如node-exporter),prometheus其实更像是一个时序数据库,以时间为主键,具体的指标名以及指标名下的标签为字段的一个巨大的数据库,这么说可能不太好理解,以下查询为例更方便理解:

在这里插入图片描述

node_netstat_Tcp_CurrEstab为node-exporter采集的监控服务器连接数的一个监控指标,那么监控下面的标签是说明他是部署在哪台机器以及他是属于哪个exporter采集过来的指标,我们再来详细查询一下

在这里插入图片描述
这样指定标签我们就把该指标详细标签下的值查询出来了,再来看
在这里插入图片描述
我们可以查询该指标一段时间内的详细值,那么问题来了,2m中查询出来为什么是8条数据,那是因为prometheus配置的是15s采集一次

既然是一个数据库,那么就必须有他的查询语言,prometheus官方定义为PromQL,以上其实就是他的查询语言,当然还有更复杂的

那么为什么说到prometheus就一定要说grafana,grafana中强大的面板设置足够美观以及客观的到把你的监控数据呈现出来,我们只需要在面板下配置好prometheus的查询语句,grafana接入prometheus数据源(叫数据源也更好的体现了prometheus作为数据库的本质)就会调用prometheus的查询接口在面板上呈现数据。

  • 下面我们开始搭建,首先搭建node-exporter采集服务器基础数据的exporter,编辑node-exporter docker-compos编排文件node-exporter.yaml
node_exporter:
  image: prom/node-exporter:latest
  container_name: node_exporter
  command:
    - '--path.rootfs=/host'
  pid: host
  restart: unless-stopped
  environment:
 - TZ=Asia/Shanghai
  ports:
    - 9100:9100
  volumes:
    - '/:/host:ro,rslave'

此docker-compose默认为一个service就可以省去services了
docker-cmpose -f node-exporter up -d 启动容器,这样我们就在9100端口暴露的监控指标数据,比如我们浏览器访问http://192.168.0.1:9100/metrics 就能看到采集的监控指标数据了(默认暴露在metrics路径下)

  • 搭建prometheus,编辑prometheus docker-compose编排文件prometheus.yaml
prometheus:
  image: prom/prometheus:latest
  restart: always
  container_name: prometheus
  hostname: prometheus
  environment:
  - TZ=Asia/Shanghai
  ports:
  - 9090:9090
  command:
    - '--config.file=/etc/prometheus/prometheus.yml'
    - '--storage.tsdb.path=/prometheus'
    - '--web.console.libraries=/usr/share/prometheus/console_libraries' 
    - '--web.console.templates=/usr/share/prometheus/consoles' 
    - '--storage.tsdb.retention.time=7d'
    - '--web.external-url=prometheus'
  volumes:
  - /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
  - /opt/promdata:/prometheus

此docker-compose默认为一个service就可以省去services了
参数介绍:

  • –config.file :配置文件目录
  • –storage.tsdb.path:指标数据存放目录
  • –storage.tsdb.retention.time:保存7天内的指标数据
  • –web.external-url:所有prometheus返回的url带上前缀prometheus,此项配置用来给nginx代理访问,可以不配置,配之后比如你的部署机器为192.168.0.1,那么访问prometheus控制台应为http://192.168.0.1:9090/prometheus

/opt/prometheus/prometheus.yml(注意此处为宿主机目录)配置文件示例:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'node-exporter'
    static_configs:
    - targets: ['192.168.0.1:9100']
      labels:
        host: myhost01

##job_name 说明prometheus需要采集哪些job以及从哪里采集,上面说到默认暴露在metrices路径下,prometheus默认也是去metrices路径下拉取指标,添加label prometheus就会在此处配置的exporter采集的所有监控指标数据里面添加一个标签为host:myhost01,当服务器需要有一些值来说明时,这个非常有用

docker-compose -f prometheus.yaml up -d 启动容器,浏览器访问http://192.168.0.1:9090/prometheus 就能看到prometheus的原生控制台了

  • 搭建grafana,编辑grafana docker-compose编排文件grafana.yaml
grafana:
  image: grafana/grafana:latest
  restart: always
  container_name: grafana
  hostname: grafana
  environment:
  - TZ=Asia/Shanghai
  volumes:
#  - /opt/grafana/defaults.ini:/etc/grafana/grafana.ini
  - /data/grafana:/var/lib/grafana
  ports:
  - 3000:3000

docker-compose -f grafana.yaml up -d 启动grafana,配置文件/opt/grafana/defaults.ini此处注释掉了,如果后续有一些基于配置文件的频繁改动,可以把容器中的配置文件/etc/grafana/grafana.ini ,docker cp 出来在放到宿主机/opt/grafana/defaults.ini此处,然后docker-compose -f grafana.yaml up -d重启启动容器即可。

浏览器访问http://192.168.0.1:3000 即可进去grafana登录页面,默认登陆账号密码为admin/admin,首次登陆会强制要求改密码

在这里插入图片描述

点击此处添加prometheus数据源

在这里插入图片描述
我们选择prometheus

在这里插入图片描述
这一页我们只需填写我们的prmetheus地址即可,其他保持默认就可以了,prometheus地址填写http://192.168.0.1:9090(注意如果prometheus启动yaml文件中配置了–web.external-url=prometheus,那么此处应该为http://192.168.0.1:9090/prometheus,否则获取不到数据源)

在这里插入图片描述

点击save & test

下面我们导入一个node-exporter的监控面板,监控面板在grafana中其实就是一个json文件,grafana官网有很多面板,每一个面板在官网有一个id,并提供了面板json文件的下载

在这里插入图片描述

进入grafana 首页,点击import

在这里插入图片描述

garafan 面板官网:https://grafana.com/grafana/dashboards/

当你的服务器可以连接外网,填入面板id即可,如果服务器不能联通外网,我们就需要去官网下载面板json文件进行导入
此处我们填入面板id:8919

在这里插入图片描述

导入完成后点击左上角图标进去首页然后点击此处我们就可以选择我们具体查看那个面板啦(如果面板比较多的话),点击我们刚刚选择的面板,就可以看到监控啦

在这里插入图片描述

监控的思考:

  1. 我们完全可以自己调用prometheus的官方库,用我们自己熟悉的语言比如java(prometheus提供了基本涵盖了所有流行语言的开发库)开发我们基于应用层面的exporter,搭建应用面板
  2. 在grafana,我们可以自己搭建面板,然后把面板的json保存下来上传到grafana官网,这样别人就可以用我们的面板了

下边介绍报警搭建,如果觉得写得还不错,点个赞,你的举手之劳是我强大的动力。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐