prometheus

docker部署promrtheus与grafana

第一部分:彻底清除当前 Docker 环境

  1. 停止所有容器

    docker stop $(docker ps -aq)
  2. 删除所有容器

    docker rm $(docker ps -aq)
  3. 删除所有镜像

    docker rmi $(docker images -q)
  4. 停止 Docker 服务

    systemctl stop docker
  5. 卸载 Docker 软件包

    dnf remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  6. 删除所有 Docker 文件和目录(这一步会彻底清除所有镜像、容器、卷和网络配置):

    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
  7. (可选)删除 Docker 的镜像仓库配置

    rm -rf /etc/docker

现在您的系统已经是一个干净的、没有 Docker 的环境了。


第二部分:在 CentOS 9 上重新安装 Docker

我们将使用官方推荐的方式安装最新版本的 Docker。

  1. 安装必要的依赖包

    dnf install -y yum-utils device-mapper-persistent-data lvm2
  2. 添加 Docker 的官方 YUM 仓库

    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    #使用这个会出现如下报错
    #root@yxy0238:~# yum-config-manager --add-repo #https://download.docker.com/linux/centos/docker-ce.repo
    #Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
    #Curl error (35): SSL connect error for #https://download.docker.com/linux/centos/docker-ce.repo [OpenSSL SSL_connect: #Connection reset by peer in connection to download.docker.com:443 ]
    #Error: Configuration of repo failed
    root@yxy0238:~# cat /etc/yum.repos.d/docker-ce.repo
    [docker-ce-stable]
    name=Docker CE Stable - $basearch
    baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
    enabled=1
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-stable-debuginfo]
    name=Docker CE Stable - Debuginfo $basearch
    baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/stable
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-stable-source]
    name=Docker CE Stable - Sources
    baseurl=https://download.docker.com/linux/centos/$releasever/source/stable
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-test]
    name=Docker CE Test - $basearch
    baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/test
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-test-debuginfo]
    name=Docker CE Test - Debuginfo $basearch
    baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/test
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-test-source]
    name=Docker CE Test - Sources
    baseurl=https://download.docker.com/linux/centos/$releasever/source/test
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-nightly]
    name=Docker CE Nightly - $basearch
    baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/nightly
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-nightly-debuginfo]
    name=Docker CE Nightly - Debuginfo $basearch
    baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/nightly
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

    [docker-ce-nightly-source]
    name=Docker CE Nightly - Sources
    baseurl=https://download.docker.com/linux/centos/$releasever/source/nightly
    enabled=0
    gpgcheck=1
    gpgkey=https://download.docker.com/linux/centos/gpg

     

  3. 安装 Docker Engine

    dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  4. 启动 Docker 服务并设置开机自启

    systemctl start docker
    systemctl enable docker
  5. 验证安装是否成功

    docker --version
    docker run hello-world

第三部分:使用 Docker 部署 Prometheus 监控栈

我们将创建目录结构、配置文件,并分别启动三个容器:Node-Exporter(收集主机指标)、Prometheus(存储和查询指标)、Grafana(可视化指标)。

步骤 1:创建目录和配置文件

  1. 创建项目目录

    mkdir -p /server/tools/docker-monitor/{prometheus,grafana}
    cd /opt/docker-monitor
  2. 创建 Prometheus 配置文件 prometheus.yml

    vim /server/tools/docker-monitor/prometheus/prometheus.yml

    将以下内容粘贴到文件中并保存(:wq)。注意缩进,YAML 对格式敏感。

    global:
    scrape_interval: 15s # 每15秒抓取一次数据
    evaluation_interval: 15s # 每15秒评估一次规则

    scrape_configs:
     # 作业名称:监控本机
    - job_name: 'node'
      static_configs:
        - targets: ['host.docker.internal:9100']  # 将 192.168.10.238 替换为 Docker 主机名host.docker.internal,或者保留localhost:9100,在运行时加上--network="host"参数

     # 作业名称:监控 Prometheus 自己
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']

创建自定义网络

docker network create monitor-net

步骤 2:部署 Node-Exporter

Node-Exporter 用于收集服务器硬件和操作系统指标。

docker run -d \
--name=node-exporter \
--network=monitor-net \
-p 9100:9100 \
--restart=always \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
  • --net="host"--pid="host":让容器使用主机网络和PID命名空间,以便可以访问所有系统信息。

  • -v "/:/host:ro,rslave":将主机根目录只读挂载到容器内,以便读取系统信息。

步骤 3:部署 Prometheus

    docker run -d \
--name=prometheus \
--network=monitor-net \
--user="root:root" \
-p 9090:9090 \
-v /server/tools/docker-monitor/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /server/tools/docker-monitor/prometheus/data:/prometheus \
--restart=always \
prom/prometheus:latest
  • -v .../prometheus.yml:/etc/...:将我们刚才创建的配置文件挂载到容器内。

  • -v .../data:/prometheus:将数据目录挂载到主机,防止容器删除后数据丢失。

  • 数据目录的所有者ID(通常是 root)。所以加上--user="root:root"

    修改配置文件后重启服务就需要执行以下命令
    docker restart prometheus
    如果需要修改容器的启动参数(如添加 --user--network 等):
    • 必须先停止并删除旧容器:

    • docker stop prometheus && docker rm prometheus
    • 然后使用新的参数重新执行 docker run ... 命令来创建并启动一个新容器。

    • 因为容器的配置(如网络模式、用户等)是在创建时决定的,无法通过 restart 来更改。

步骤 4:部署 Grafana

修改 Grafana 数据目录的所有权(Grafana 在容器内以用户ID 472运行):

chown -R 472:472 /server/tools/docker-monitor/grafana/data

Grafana 容器默认以用户ID 472运行,现在挂载的目录也有了这个用户的写权限。

docker run -d \
--name=grafana \
--network=monitor-net \
-p 3000:3000 \
-v /server/tools/docker-monitor/grafana/data:/var/lib/grafana \
--restart=always \
grafana/grafana:latest
  • -v .../data:/var/lib/grafana:持久化存储 Grafana 的配置、仪表板和数据源信息。


第四部分:访问和验证服务

  1. 查看容器状态

    docker ps

    应该能看到 node-exporter, prometheus, grafana 三个容器都在运行(STATUS 为 Up)。

  2. 访问服务

    • Prometheus: 打开浏览器,访问 http://<您的服务器IP>:9090。进入 Status -> Targets,应该能看到 nodeprometheus 两个 job 的状态都是 UP。这表示配置正确,Prometheus 正在成功抓取数据。

    • Grafana: 打开浏览器,访问 http://<您的服务器IP>:3000

      • 首次登录用户名和密码都是 admin

      • 登录后会要求修改密码,可以稍后修改。

    • 配置 Grafana 数据源

      • 在 Grafana 首页,点击 Add your first data source

      • 选择 Prometheus

      • 在 URL 处填写 http://<您的服务器IP>:9090注意:如果Grafana和Prometheus在同一台机器,这里可以填 http://host.docker.internal:9090 或直接填服务器IP)。

      • 点击 Save & Test,应该显示 Data source is working

  3. 导入仪表板

    • 在 Grafana 中,点击左侧 + 号 -> Import

    • Import via grafana.com 框中输入 1860(这是一个非常流行的 Node-Exporter 仪表板ID)。

    • 点击 Load,然后选择 Prometheus 数据源,点击 Import

    • 您现在就能看到漂亮的服务器监控仪表板了!

至此,您已经在 CentOS 9 上完成了一个干净、完整的 Prometheus 监控栈的部署。所有数据都已持久化,容器配置为自动重启,非常稳定。

Prom QL语句

    1 prometheus metrics type

prometheus监控中采集过来的数据统一称为Metrics数据,其并不是代表具体的数据格式,而是一种统计度量计算单位。

 

当我们需要为某个系统或者某个服务做监控时,就需要使用到metrics。

 

prometheus支持的metrics包括但不限于以下几种数据类型:

    guage: 所见即所得

       最简单的度量指标,只是一个简单的返回值,或者叫瞬时状态。

       比如说统计硬盘,内存等使用情况。

   

    couter:

       就是一个计数器,从数据量0开始累积计算,在理想情况下,只能是永远的增长,不会降低(有特殊情况,比如粉丝量)。

       比如统计1小时,1天,1周,1一个月的用户访问量,这就是一个累加的操作。

      

    histograms:

       是统计数据的分布情况,比如最小值,最大值,中间值,中位数等,代表的是一种近似百分比估算数值。

       通过histograms可以分别统计处在一个时间段(1s,2s,5s,10s)内nginx访问用户的响应时间。

      

    summary:

       summary是histograms的扩展类型,主要弥补histograms不足。

本。

2 PromQL初体验

       2.1 查看某个特定的key

node_cpu_seconds_total

       2.2 查看某个节点的指标

node_cpu_seconds_total{instance="10.0.0.41:9100"}

       2.3 查看某个节点的某刻CPU的某种状态

node_cpu_seconds_total{instance="10.0.0.41:9100",cpu="0",mode="idle"}

       2.4 查询最近10s内某个节点CPU的某种状态时间

node_cpu_seconds_total{instance="10.0.0.41:9100",cpu="0",mode="idle"}[10s]

       2.5 统计1分钟内,使用标签过滤器查看”10.0.0.42:9100″节点的第0颗CPU,非空闲状态使用的总时间

node_cpu_seconds_total{mode!="idle",cpu="0", instance="10.0.0.42:9100"}[1m]

       2.6 统计1分钟内,使用标签过滤器查看”10.0.0.42:9100″节点的第0颗CPU,mode名称以字母”i”开头的所有CPU核心。

node_cpu_seconds_total{mode=~"i.*",cpu="0", instance="10.0.0.42:9100"}[1m]

       2.7 统计1分钟内,使用标签过滤器查看”10.0.0.42:9100″节点的第0颗CPU,mode名称不是以字母”i”开头的所有CPU核心。

node_cpu_seconds_total{mode!~"i.*",cpu="0", instance="10.0.0.42:9100"}[1m] 

统计cpu繁忙程度:

先进行cpu压力测试(stress 命令)10分钟,内存只占256M

stress –cpu 8 –io 4 –vm 2 –vm-bytes 128M –timeout 10m

验证繁忙程度:

prometheus查询cpu:node_cpu_seconds_total为key,{}里面叫做标签选择器–用于过滤指标,cpu选择1,[10m]10分钟内

查询114.55.148.180这台机器第1颗cpu十分钟内CPU使用的总时间:node_cpu_seconds_total{instance=”114.55.148.180:9100″,cpu=”1″}[10m]

查看数据中代表的时间 date -s "@1749997721" -R
Sun, 15 Jun 2025 22:28:41 +0800
当前时间 date
Sun Jun 15 10:28:44 PM CST 2025

3 Prometheus常用的函数

       3.1 increase

increase函数:

    用来针对counter数据类型,截取其中一段时间总的增量。

举个例子:

    increase(node_cpu_seconds_total{mode=”idle”,cpu=”0″, instance=”10.0.0.42:9100″}[1m])

       统计1分钟内,使用标签过滤器查看”10.0.0.42:9100″节点的第0颗CPU,空闲状态使用的总时间增量。

 

 

       3.2 sum

sum函数:   加和的作用。

举个例子:

sum(increase(node_cpu_seconds_total{mode=”idle”,cpu=”0″}[1m]))

       统计1分钟内,使用标签过滤器查看所有节点的第0颗CPU,空闲状态使用的总时间增量,并将返回结果累加。

    3.3 by       by函数:按照括号内的值进行分组

    将数据进行分组,类似于MySQL的”GROUP BY”。

举个例子:

    sum(increase(node_cpu_seconds_total{mode=”idle”}[1m])) by (instance)

       统计1分钟内,使用标签过滤器查看CPU空闲状态,并将结果进行累加,基于instance进行分组。

    3.4 rate

rate函数:

    它的功能是按照设置的时间段,取counter在这个时间段中平均每秒的增量。

举个例子:

 rate(node_cpu_seconds_total{mode=”idle”,cpu=”0″, instance=”10.0.0.42:9100″}[1m])

       统计1分钟内,使用标签过滤器查看”10.0.0.42:9100″节点的第0颗CPU,空闲状态使用的每秒的增量。

    

increase和rate如何选择:

    (1)对于采集数据频率较低的场景建议使用increase函数,
因为使用rate函数可能会出现断点,比如针对硬盘容量监控。

    (2)对于采集数据频率较高的场景建议使用rate函数,
比如针对CPU,内存,网络流量等都是可以基于rate函数来采集等。

 

    3.5 topk

topk函数:

    取前几位的最高值,实际使用的时候一般会用该函数进行瞬时报警,而不是为了观察曲线图。

举个例子:

    topk(3, rate(node_cpu_seconds_total{mode=”idle”}[1m]))

       统计1分钟内,使用标签过滤器查看CPU,所有状态使用的每秒的增量,只查看前3个节点。按照空闲时间排序,越闲的cpu数值越高

    3.6 count

count函数:

    把数值符合条件的,输出数目进行累加加和。

    比如说企业中有100台服务器,如果只有10台服务器CPU使用率高于80%时候是不需要报警的,但是数量操作70台时就需要报警了。

举个例子:

 count(oldboyedu_tcp_wait_conn > 500):

       假设oldboyedu_tcp_wait_conn是咱们自定义的KEY。

       若TCP等待数量大于500的机器数量就判断条件为真。

 

    count(rate(node_cpu_seconds_total{cpu=”0″,mode=”idle”}[1m]))

       对统计的结果进行计数。

  count(rate(node_cpu_seconds_total{cpu=”0″,mode=”idle”}[1m]) > 0.5)

       统计1分钟内编号为0空闲cpu每秒空闲大于0.5的节点有几个。

    3.7 其他函数

推荐阅读:

https://prometheus.io/docs/prometheus/latest/querying/functions/

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部