使用 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 Engine 來編輯檔案。
新增以下配置
{
"metrics-addr": "127.0.0.1:9323"
}
儲存檔案,或者對於 Docker Desktop for Mac 或 Docker Desktop for Windows,儲存配置。重啟 Docker。
Docker 現在透過環回介面在埠 9323 上暴露與 Prometheus 相容的指標。您可以將其配置為使用萬用字元地址 0.0.0.0
,但這會將 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://: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 守護程序設定為 Prometheus 目標。配置守護程序的 metrics-addr
並在您的 Prometheus 配置中將守護程序的地址新增為抓取端點。
- job_name: docker
static_configs:
- targets: ["docker.daemon.example:<PORT>"]
有關 Prometheus 的更多資訊,請參閱 Prometheus 文件