Docker 监控教程 – 如何使用 Telegraf 和 InfluxDB 监控 Docker

导航至

本文最初发布在 CNCF 博客,作者是 Cameron Pavey。向下滚动查看作者简介。

Docker 对于处理容器化应用程序的企业来说,是一个越来越受欢迎的选择。然而,与任何新技术一样,Docker 也引入了需要管理的复杂性。其中一些复杂性与基础设施和 应用程序监控 相关。由于容器提供的抽象,传统的监控解决方案可能不适用于基于 Docker 的工作负载。

幸运的是,像 InfluxDBTelegraf 这样的工具可以帮助您缓解这种复杂性,让您轻松监控基于 Docker 的应用程序。本教程将教您如何设置和配置 InfluxDB 和 Telegraf,以从 Docker 安装中收集指标。

为什么要监控 Docker

与传统的非容器化工作负载一样,有几个原因说明监控基于 Docker 的应用程序至关重要。关注应用程序的关键指标可以让您在性能问题和资源分配优化等方面保持主动。如果您的应用程序例行消耗的资源远超您的预期,您需要尽早知道这一点。如果无人看管,这些问题可能会导致来自云提供商的意外账单或来自不满意的客户的支持请求(如果存在潜在的性能问题)。

如果您拥有应用程序在运行时行为的详细指标,您就可以尽早解决问题。通常,您希望收集 CPU 和内存使用率等指标,以及磁盘和网络 I/O,以及任何数量的其他更具体的指标,具体取决于您的应用程序的需求。

但是,收集大量此类数据可能会很快变得棘手。您需要收集数据并以有意义的方式存储,并拥有一种机制来提取数据以进行分析和可视化。这就是 InfluxDB 和 Telegraf 的用武之地。

InfluxDB 是一个专门构建的 时间序列数据库,具有许多强大的功能。特别是,内置的 数据可视化 工具和强大的 Flux 数据脚本语言是对已经强大的时间序列数据库产品的吸引力补充。然后,InfluxDB 可以与 Telegraf 配对使用,Telegraf 是一种基于服务器的代理,用于从各种系统收集指标。由于灵活的插件架构,Telegraf 已经支持超过 300 个插件,用于从不同的端点收集指标,包括 Docker。

先决条件

在开始本教程之前,您需要在系统上安装 Docker 并正确配置。您可以参考 官方文档,了解在您选择的操作系统上安装 Docker 的步骤。如果您使用的是基于 Unix 的操作系统,您也可以 将您的用户添加到 Docker 组,以便您以非 root 用户身份使用 Docker。

安装并配置 Docker 后,您可以运行以下命令来验证它是否按预期工作

docker run hello-world

此命令应打印一些输出,以确认一切正常运行

Docker run hello-world 输出

您还应该注意,本教程假设您使用的是基于 Linux 的操作系统,例如 Ubuntu,用于代码片段和命令。本教程后面有一个部分,如果您使用的是 macOS,则该命令将失败,但请放心,如果发生这种情况,有一个简单的解决方案。

使用 InfluxDB 和 Telegraf 监控 Docker

安装 Docker 后,您现在可以开始安装和配置 InfluxDB 和 Telegraf。虽然您可以直接在您的机器上安装这两个软件,但本教程将向您展示如何将它们作为 Docker 容器安装和集成。

在创建容器之前,您需要创建一个 Docker 网络,以便它们可以相互通信。您可以使用以下命令执行此操作

docker network create --driver bridge influxdb-net

InfluxDB

现在您需要创建一个新的 influx-data/ 目录。您将此目录挂载到此容器使用的 Docker 卷,这意味着即使容器停止运行,您的数据也能够持久存在

mkdir influx-data && cd influx-data

进入目录后,您可以运行以下命令来拉取 influxdb Docker 镜像并使用它创建一个容器(将您的 influx-data/ 目录映射到容器的卷)

docker run \
	--name influxdb \
	-p 8086:8086 \
	--volume $PWD:/var/lib/influxdb2 \
	--net=influxdb-net \
	-d \
	influxdb:2.1.1

运行此命令将启动 InfluxDB 的一个实例在容器中,可以通过您主机的 IP 地址在端口 8086 访问。在配置 Telegraf 之前,您需要设置您的 InfluxDB 安装并设置一些参数,例如您的存储桶名称。

配置 InfluxDB

导航到您的 Docker 主机 IP 地址上的端口 8086(如果您在本地运行 Docker,请尝试 http://127.0.0.1:8086/。)现在,您应该看到 InfluxDB 欢迎屏幕。单击 Get started(开始)。您将被提示创建您的初始用户。记下您在此处提供的 Initial Organization Name(初始组织名称)和 Initial Bucket Name(初始存储桶名称),因为您稍后将在 Telegraf 配置中需要它们

设置初始用户

填写完这些详细信息后,单击 Continue(继续),在最后一个屏幕上,选择 Configure Later(稍后配置)。然后您将被带回到主仪表板。从那里,选择 Load your data(加载您的数据),在后续页面上,选择 Telegraf 选项卡

创建 Telegraf 配置

在此选项卡上,选择 + Create Configuration(+ 创建配置)。系统会询问您要监控哪种系统。选择 Docker 并单击 Continue(继续)。为配置指定一个语义名称(如“Docker”),然后单击 Create and verify(创建并验证)。然后 InfluxDB 将向您显示一个 API 令牌和一个 URL,该 URL 将为您提供 Telegraf 的部分配置文件

配置您的 API 密钥

记下此 API 密钥,因为您稍后将需要它。

有了此 API 密钥,您就拥有了配置 Telegraf 容器并开始记录一些指标所需的最后一部分。对于本教程,您不需要提供的配置文件,因为将为您提供一个包含一些额外部分的配置文件。

Telegraf

回到您的终端,如果您仍在 influx-data/ 目录中,您可以离开此目录并创建一个名为 telegraf-data/ 的新目录。此目录将保存 Docker 将挂载到容器中的 Telegraf 配置文件

# If you’re still in the influx-data/ directory
cd ..

mkdir telegraf-data && cd telegraf-data

在此目录中,创建一个名为 telegraf.conf 的文件,并将其内容设置为如下所示

[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

[[inputs.docker]]
  endpoint = "unix:///var/run/docker.sock"
  gather_services = false
  container_names = []
  source_tag = false
  container_name_include = []
  container_name_exclude = []
  timeout = "5s"
  perdevice = true
  total = false
  docker_label_include = []
  docker_label_exclude = []
  tag_env = ["JAVA_HOME", "HEAP_SIZE"]

[[outputs.influxdb_v2]]
  urls = ["http://influxdb:8086"]
  token = "$INFLUX_TOKEN"
  organization = "influx-docker-demo"
  bucket = "influx-docker-demo"

如果您使用了不同的 organization(组织)或 bucket(存储桶)名称,您可能需要编辑此文件中的最后一个块。同样,如果您为您的 InfluxDB 容器指定了除 influxdb 之外的名称,您将需要在 urls 键的值中反映该更改。

创建此文件后,您可以从您的 telegraf-data/ 目录运行以下命令来创建容器

docker run -d --name=telegraf \
	-v $(pwd)/telegraf.conf:/etc/telegraf/telegraf.conf \
	-v /var/run/docker.sock:/var/run/docker.sock \
	--net=influxdb-net \
	--user telegraf:$(stat -c '%g' /var/run/docker.sock) \
	--env INFLUX_TOKEN="your_api_key" \
	telegraf

注意:如果您使用 macOS,此命令可能会失败,因为 stat 命令在 Mac 和 Linux 之间略有不同。如果发生这种情况,请尝试将 -c 标志替换为 -f 标志,如下所示:–user telegraf:$(stat -f ‘%g’ /var/run/docker.sock) </em>。

之前的命令为使其正确工作做了一些重要的事情。以下是逐行说明:

  • 第一个 -v 标志挂载您刚刚创建的配置文件。
  • 第二个 -v 标志挂载主机的 Docker 套接字,这使 Telegraf 能够收集有关您的 Docker 服务器的详细信息。
  • –net 标志确保此容器和先前创建的 InfluxDB 容器都在同一网络上,这就是您创建的配置文件如何通过其 DNS 名称 influxdb 引用 InfluxDB 容器的原因。
  • –user 标志是必需的,因为 Telegraf 镜像在内部使用名为 telegraf 的用户和组,因此您必须将其映射到有权访问 docker.sock 文件的用户。
  • –env 标志指定一个环境变量,其中包含您创建的配置文件中使用的 InfluxDB 实例的 API 密钥。

运行此命令后,您可以检查 Docker 日志,看看是否有任何意外问题

docker logs telegraf

如果一切正常,您应该看到类似这样的输出,没有错误

Docker 日志

如果一切看起来都很好,您就可以在 InfluxDB 中可视化您的数据了。

如果您看到有关尝试访问 /var/run/docker.sock 时权限被拒绝的错误,您可以通过运行以下命令来解决此错误,这将更改容器中套接字的权限,允许 telegraf 用户正确访问它

docker exec -u root -it telegraf /bin/sh -c "chmod 666 /var/run/docker.sock"
可视化数据

返回浏览器中的 InfluxDB,然后从侧边栏中选择 Data(数据)。接下来,选择 Buckets(存储桶)选项卡,然后选择您配置 Telegraf 使用的存储桶的名称

数据存储桶

这将带您进入 Data Explorer(数据浏览器)页面,您应该能够在其中看到 Telegraf 正在馈送到 InfluxDB 的数据。默认情况下,捕获了相当多的指标,包括 CPU 和内存使用率以及网络统计信息。您可以单击屏幕底部的不同过滤器,查看所有其他可用数据

数据浏览器

有关如何从您的数据中导出有意义的可视化的更多信息,您可以参考 官方文档 以了解更多信息。

总结

在本教程中,您学习了如何使用 TelegrafInfluxDB 监控来自 Docker 的关键指标。

作为时间序列数据库,InfluxDB 非常适合存储和可视化应用程序监控经常处理的各种指标,因为通常在 规则的时间间隔内有大量数据点。对于如此大量的数据,您必须有一种机制来可视化、搜索和理解数据以获得洞察力。InfluxDB 在这方面非常合适,这要归功于其易于配置的可视化以及强大的 Flux 数据脚本语言,使您可以查询和分析您的数据。

关于作者

Cameron 是一位全栈开发人员,在墨尔本生活和工作。他致力于永无止境的旅程,理解高质量代码、开发人员生产力和工作满意度的复杂性。