使用 Prometheus 收集 Docker 指标

Prometheus 是一个开源系统监控和 警报工具包。您可以将 Docker 配置为 Prometheus 目标。

警告

可用指标和这些指标的名称处于活动状态 开发,并且可能随时更改。

目前,您只能监控 Docker 本身。您目前无法监控 应用程序。

以下示例向您展示如何配置 Docker 守护进程,设置 Prometheus 作为容器在本地计算机上运行,并监控 Docker 实例。

配置守护程序

要将 Docker 守护程序配置为 Prometheus 目标,您需要在配置文件中指定 。此守护进程需要 默认情况下,该文件将位于以下位置之一。如果 文件不存在,请创建它。metrics-addressdaemon.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"
}

保存文件,或者对于 Mac 的 Docker Desktop 或 Docker Desktop Windows 中,保存配置。重新启动 Docker。

Docker 现在在环回的端口 9323 上公开了与 Prometheus 兼容的指标 接口。

创建 Prometheus 配置

复制以下配置文件并将其保存到您选择的位置, 例如。这是一个 Prometheus 配置文件, 除了在文件底部添加 Docker 作业定义。/tmp/prometheus.yml

# 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,则该标志是可选的。此标志 确保主机的内部 IP 暴露给 Prometheus 容器。默认情况下,Docker Desktop 执行此操作。主机 IP 作为主机名公开。这与上一步中定义的配置相匹配。--add-hosthost.docker.internalprometheus.yml

打开 Prometheus 控制面板

验证 Docker 目标是否列在 中。http://localhost:9090/targets/

Prometheus targets page

注意

如果您使用 Docker,则无法直接访问此页面上的终端节点 URL 桌面。

使用 Prometheus

创建图表。选择 Prometheus UI 中的 Graphs (图形) 链接。选择指标 从 Execute 按钮右侧的组合框中,然后单击 Execute。下面的屏幕截图显示了 的图表。engine_daemon_network_actions_seconds_count

Idle Prometheus report

该图显示了一个相当空闲的 Docker 实例,除非您已经在运行 系统上的活动工作负载。

要使图表更有趣,请运行使用某个网络的容器 操作:

$ docker run --rm alpine apk add git make musl-dev go

等待几秒钟(默认抓取间隔为 15 秒),然后重新加载 图。您应该会在图表中看到一个上升趋势,显示网络增加 您刚刚运行的容器引起的流量。

Prometheus report showing traffic

后续步骤

此处提供的示例显示了如何将 Prometheus 作为容器运行 local 系统。在实践中,您可能会在另一个 系统或作为某个位置的云服务。您可以将 Docker 守护程序设置为 Prometheus 也在这种情况下以 Prometheus 为目标。配置 守护进程,并将守护进程的地址添加为 Scrape 端点 Prometheus 配置。metrics-addr

- job_name: docker
  static_configs:
    - targets: ["docker.daemon.example:<PORT>"]

有关 Prometheus 的更多信息,请参阅 Prometheus 文档