使用 Prometheus 收集 Docker 指标
Prometheus是一个开源系统监控和警报工具包。您可以将 Docker 配置为 Prometheus 目标。
警告
可用指标和这些指标的名称正在积极开发中,可能随时更改。
目前,您只能监控 Docker 本身。您当前无法使用 Docker 目标监控您的应用程序。
例子
以下示例向您展示如何配置 Docker 守护进程、将 Prometheus 设置为在本地计算机上作为容器运行,以及如何使用 Prometheus 监控 Docker 实例。
配置守护进程
要将 Docker 守护进程配置为 Prometheus 目标,您需要
metrics-address
在daemon.json
配置文件中指定。默认情况下,该守护程序期望该文件位于以下位置之一。如果该文件不存在,请创建它。
- Linux:
/etc/docker/daemon.json
- Windows 服务器:
C:\ProgramData\docker\config\daemon.json
- Docker Desktop:打开 Docker Desktop 设置并选择Docker Engine来编辑文件。
添加以下配置:
{
"metrics-addr": "127.0.0.1:9323"
}
保存文件,或者对于 Docker Desktop for Mac 或 Docker Desktop for Windows,保存配置。重新启动 Docker。
Docker 现在在环回接口的端口 9323 上公开与 Prometheus 兼容的指标。
创建普罗米修斯配置
复制以下配置文件并将其保存到您选择的位置,例如/tmp/prometheus.yml
.这是一个普通的 Prometheus 配置文件,除了在文件底部添加了 Docker 作业定义之外。
# 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).
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: "codelab-monitor"
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first.rules"
# - "second.rules"
# 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: prometheus
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: docker
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["host.docker.internal:9323"]
在容器中运行 Prometheus
接下来,使用此配置启动 Prometheus 容器。
$ docker run --name my-prometheus \
--mount type=bind,source=/tmp/prometheus.yml,destination=/etc/prometheus/prometheus.yml \
-p 9090:9090 \
--add-host host.docker.internal=host-gateway \
prom/prometheus
如果您使用的是 Docker Desktop,则该--add-host
标志是可选的。该标志确保主机的内部 IP 暴露给 Prometheus 容器。 Docker Desktop 默认执行此操作。主机 IP 作为
host.docker.internal
主机名公开。这prometheus.yml
与上一步中定义的配置匹配
。
打开普罗米修斯仪表板
验证 Docker 目标是否在 中列出http://localhost:9090/targets/
。


笔记
如果您使用 Docker Desktop,则无法直接访问此页面上的端点 URL。
使用普罗米修斯
创建一个图表。选择Prometheus UI 中的图表链接。从“执行”按钮右侧的组合框中选择一个指标,然后单击
“执行”。下面的屏幕截图显示了 的图表
engine_daemon_network_actions_seconds_count
。


该图显示了一个相当空闲的 Docker 实例,除非您已经在系统上运行活动工作负载。
为了使图表更有趣,请通过使用包管理器开始下载一些包来运行一个使用一些网络操作的容器:
$ docker run --rm alpine apk add git make musl-dev go
等待几秒钟(默认抓取间隔为 15 秒)并重新加载图表。您应该看到图表中出现上升,显示您刚刚运行的容器导致的网络流量增加。


下一步
此处提供的示例展示了如何在本地系统上将 Prometheus 作为容器运行。在实践中,您可能会在另一个系统上运行 Prometheus 或在某个地方作为云服务运行。您也可以在此类上下文中将 Docker 守护进程设置为 Prometheus 目标。配置metrics-addr
守护程序的地址并将守护程序的地址添加为 Prometheus 配置中的抓取端点。
- job_name: docker
static_configs:
- targets: ["docker.daemon.example:<PORT>"]
有关 Prometheus 的更多信息,请参阅 Prometheus 文档