使用 Prometheus 收集 Docker 指标
Prometheus 是一个开源的系统监控和警报工具包。你可以将 Docker 配置为 Prometheus 目标。
警告
可用的指标以及这些指标的名称正在积极开发中,可能随时更改。
目前,你只能监控 Docker 本身。你目前无法使用 Docker 目标监控你的应用程序。
示例
以下示例展示了如何配置 Docker 守护程序、设置 Prometheus 在本地机器上作为容器运行以及使用 Prometheus 监控 Docker 实例。
配置守护进程
要将 Docker 守护程序配置为 Prometheus 目标,你需要在 daemon.json
配置文件中指定 metrics-address
。此守护程序默认情况下会期望该文件位于以下位置之一。如果文件不存在,请创建它。
- **Linux**:
/etc/docker/daemon.json
- **Windows Server**:
C:\ProgramData\docker\config\daemon.json
- **Docker Desktop**:打开 Docker Desktop 设置,选择 **Docker 引擎** 以编辑文件。
添加以下配置
{
"metrics-addr": "127.0.0.1:9323"
}
保存文件,或在 Docker Desktop for Mac 或 Docker Desktop for Windows 的情况下,保存配置。重新启动 Docker。
Docker 现在在环回接口上的端口 9323 上公开与 Prometheus 兼容的指标。
创建 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
中定义的配置相匹配。
打开 Prometheus 仪表板
验证 Docker 目标是否列在 https://127.0.0.1:9090/targets/
上。


注意
如果你使用的是 Docker Desktop,你无法直接访问此页面上的端点 URL。
使用 Prometheus
创建图表。在 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 文档