使用 Prometheus 收集 Docker 指標
Prometheus 是一個開源系統監控和警報工具包。您可以將 Docker 設定為 Prometheus 目標。
警告
可用的指標和這些指標的名稱正在積極開發中,隨時可能更改。
目前,您只能監控 Docker 本身。您目前無法使用 Docker 目標監控您的應用程式。
範例
以下範例說明如何設定 Docker Daemon、將 Prometheus 設定為在您的本機電腦上以容器的形式執行,以及使用 Prometheus 監控您的 Docker 執行個體。
設定 Daemon
要將 Docker Daemon 設定為 Prometheus 目標,您需要在 `daemon.json` 設定檔中指定 `metrics-address`。預設情況下,此 Daemon 預期檔案位於以下位置之一。如果檔案不存在,請建立它。
- Linux:`/etc/docker/daemon.json`
- Windows Server:`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 相容的指標。
建立 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 目標列在 `http://localhost:9090/targets/` 中。


注意
如果您使用 Docker Desktop,則無法直接存取此頁面上的端點 URL。
使用 Prometheus
建立圖表。在 Prometheus UI 中選取 **Graphs** 連結。從 **Execute** 按鈕右側的組合方塊中選擇一個指標,然後按一下 **Execute**。以下螢幕截圖顯示了 `engine_daemon_network_actions_seconds_count` 的圖表。


圖表顯示了一個相當閒置的 Docker 實例,除非您的系統上已經運行著活動的工作負載。
為了讓圖表更有趣,請運行一個使用網路動作的容器,方法是使用套件管理器開始下載一些套件。
$ docker run --rm alpine apk add git make musl-dev go
等待幾秒鐘(預設的抓取間隔為 15 秒),然後重新載入圖表。您應該會看到圖表中的上升趨勢,顯示您剛才運行的容器導致網路流量增加。


後續步驟
此處提供的範例顯示如何在您的本機系統上以容器的形式運行 Prometheus。實際上,您可能會在另一個系統上或以雲端服務的形式運行 Prometheus。在這種情況下,您也可以將 Docker daemon 設定為 Prometheus 的目標。設定 daemon 的 metrics-addr
,並將 daemon 的地址添加為 Prometheus 設定中的抓取端點。
- job_name: docker
static_configs:
- targets: ["docker.daemon.example:<PORT>"]
有關 Prometheus 的更多資訊,請參閱 Prometheus 文件