使用 Dockprom 使用 Grafana 监控 Docker 容器

监测是该领域的重要活动之一 DevOps 世界. 我什至不需要说服你为什么监控是个好主意。 你已经知道了,对吧?

您当然可以坚持使用命令行工具来监控您的服务器和在其上运行的 docker 容器,基于 GUI 的方法增加了分析性能指标的便利性,并以直观的体验同时在屏幕上观察多个参数它还使得与较少技术人员共享监控仪表板更容易。

在本教程中,我将向您展示如何使用 dockprom 设置 docker 容器的监控,并通过 Grafana 以视觉上吸引人的形式呈现它。

使用 Dockprom 监控 docker 主机和容器

码头舞会 是一个这样的堆栈,它运行各种监控工具作为一个集合工具集,以满足您的服务器监控需求。

请记住,这里的示例将基于 Nginx 反向代理配置。 官方的 Dockprom 配置是基于 球童.

在 Linux 手册和 高开 Cloud,我们在标准实践中使用 Nginx。 所以,我重新设计了基于 Nginx 而不是 Caddy 的 Dockprom 配置。 结果看起来非常简单,就像我们之前的 Nginx 部署一样。

Dockprom 设置的要点

Dockprom 利用以下工具为您的 Docker 主机和容器提供监控解决方案。

格拉法纳

格拉法纳 允许您查询、可视化和警报指标和日志,无论它们存储在哪里。 这将是主要且唯一的 Web 前端,您将通过该前端利用其余工具部分中共享的所有其余后端应用程序。

因此,您需要在此处添加您一直在使用的流行的基于 Nginx 的环境变量,以便从 Web 上的任何位置访问我们的应用程序:

environment:
  - VIRTUAL_HOST=dockprom.domain.com
  - LETSENCRYPT_HOST=dockprom.domain.com

确保根据您的域或子域进行更改。

普罗米修斯

普罗米修斯 是全球数千人使用的开源系统监控和警报工具包。

推送网关

推送网关 是一种中介服务,允许您从无法抓取的作业中推送指标。 你可能想要 读这个 真正知道你是否真的需要它。 这是因为在有限的情况下需要这样做。

警报管理器

警报管理器 处理由 Prometheus 服务器等客户端应用程序发送的警报。 它负责对它们进行重复数据删除、分组并将它们路由到正确的接收器集成,例如电子邮件、 寻呼机, 或者 行动精灵. 它还负责警报的静音和抑制。

cAdvisor

cAdvisor 是谷歌的一个开源工具,它让容器用户了解他们正在运行的容器的资源使用和性能特征。

在这个特定的配置中,在部署 Dockprom Stack 中所述的官方 cAdvisor 配置后,我遇到了一个问题,即基于两个各自的错误获取两个指标:

Failed to get system UUID: open /etc/machine-id: no such file or directory
Could not configure a source for OOM detection, disabling OOM events: open /dev/kmsg: no such file or directory

我查找了提供解决方案的官方 cAdvisor 存储库。 这 第一 工作,但 第二 不是我想要的,因为这个解决方案是基于 docker run 基于启动命令。

需要 Docker Compose 修复。 我首先尝试安装 /dev/kmsg 但这并不能完成这项工作。 最后,基于 docker run 基于解决方案,我发现在类似的行中,Docker Compose 提供了一个单独的标志,称为 devices 可用于安装 /dev/kmsg 作为一个设备。 你可以阅读它 这里.

因此,第一个问题的修复是在卷部分的行中添加以下内容:

	volumes:
  	  ---
      ---
      - /etc/machine-id:/etc/machine-id:ro
      - /var/lib/dbus/machine-id:/var/lib/dbus/machine-id:ro

第二个是刚才讨论的:

    devices:
      - /dev/kmsg:/dev/kmsg

请注意这些指标对于从主机挂载是多么重要,因为它是您要通过 Docker 监控的主机。

节点导出器

普罗米修斯 节点导出器 公开了各种与硬件和内核相关的指标。 它类似于 cAdvisor 中公开指标的方式。

结合以上所有内容,您的完整 Docker Compose 文件将如下所示:

version: '3.7'

networks:
  net:
    external: true

volumes:
    prometheus_data: {}
    grafana_data: {}

services:

  prometheus:
    image: prom/prometheus:v2.24.0
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=200h'
      - '--web.enable-lifecycle'
    restart: on-failure
    networks:
      - net
    labels:
      org.label-schema.group: "monitoring"

  alertmanager:
    image: prom/alertmanager:v0.21.0
    container_name: alertmanager
    volumes:
      - ./alertmanager:/etc/alertmanager
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
    restart: on-failure
    networks:
      - net
    labels:
      org.label-schema.group: "monitoring"

  nodeexporter:
    image: prom/node-exporter:v1.0.1
    container_name: nodeexporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    restart: on-failure
    networks:
      - net
    labels:
      org.label-schema.group: "monitoring"

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.38.7
    container_name: cadvisor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro
      - /etc/machine-id:/etc/machine-id:ro
      - /var/lib/dbus/machine-id:/var/lib/dbus/machine-id:ro
      #- /dev/kmsg:/dev/kmsg:rw
    #command: ["start", "--privileged"]
    restart: on-failure
    devices:
      - /dev/kmsg:/dev/kmsg
    networks:
      - net
    labels:
      org.label-schema.group: "monitoring"

  grafana:
    image: grafana/grafana:7.3.7
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
    restart: on-failure
    networks:
      - net
    environment:
      - VIRTUAL_HOST=dockprom.domain.com
      - LETSENCRYPT_HOST=dockprom.domain.com

    labels:
      org.label-schema.group: "monitoring"

  pushgateway:
    image: prom/pushgateway:v1.3.1
    container_name: pushgateway
    restart: on-failure
    networks:
      - net
    labels:
      org.label-schema.group: "monitoring"

如果你好奇,你可以检查和比较上面的文件 官方 Dockprom 设计.

设置 docker 主机和容器监控

现在,由于我已经与服务器监控工具的官方定义分享了 Dockprom 堆栈实现的内容,现在让我列出部署这个基于 Nginx 的 Dockprom 设计的分步过程以及基本的 cAdvisor 修复。

出于测试目的,您可以使用 Linode 上的 1 GB 纳米节点 要尝试配置,但出于生产目的,服务器至少需要 4 GB。 这主要是 因为普罗米修斯.

我想你对 Docker 和 Docker Compose 的概念很熟悉。 另请注意,您只能监控在同一台服务器上运行的 Docker 容器。

第 1 步:获取官方 Dockprom 配置

在服务器上打开一个终端并输入以下命令:

git clone https://github.com/stefanprodan/dockprom
cd dockprom

第 2 步:修改 docker-compose.yml 文件

正如我刚才在 Node Exporter 部分讨论和分享的基于 Nginx 的 docker-compose.yml 文件一样。 请编辑文件并修改它。

第 3 步:启动配置!

假设您在同一个 dockprom 目录中,运行 Docker Compose 命令来启动 Dockprom Stack:

docker-compose up -d

第 4 步:通过 Grafana 访问 Dockprom 堆栈

还记得您在 Grafana 配置中额外设置了访问 URL 以进行 Web 访问吗? 现在您可以使用它来获得对堆栈的完全访问权限。

这俩 用户名和密码已设置为 admin. 强烈建议将其更改为强密码。 典型的 Web 登录面板如下所示:

Grafana 登录屏幕

等待一段时间以加载界面:

Grafana 加载屏幕

奖金提示

登录 Grafana 后,首先快速导航到指标统计信息可能会让人不知所措,这就是为什么我将分享指向仪表板面板的直接链接以便立即访问:https://dockprom.domain.com/dashboards

如您所见,您只需要添加 /dashboards 到您自己的域或子域。 在此页面中,您可以监控以下指标:

  • 码头集装箱
  • 主机系统
  • 普罗米修斯
  • Nginx
使用 Grafana 监控 docker 容器

请注意,如果没有直接安装在主机上,Nginx(上面列表中的第 4 个和最后一个)将显示空的统计信息。 这不应与 Jwilder Nginx 混淆,因为它在 Docker 上运行。 在这种情况下,您必须专门监视 Nginx 容器。

这是 Docker 主机监控的 Grafana 屏幕:

使用 Grafana 监控 Docker 主机

本文开头我已经分享了容器监控截图:

使用 Grafana 监控 Docker 容器

我希望这个简短的教程可以帮助您在服务器上设置这个资源丰富的堆栈。 同样,这对于单个服务器很有用。 如果你在多台服务器上有容器,你可以使用来自同一个开发者的 Swarmprom。

如果您有任何意见或建议,请随时在下面的部分中分享您的观点。