使用 cAdvisor 監控 Docker 容器指標
cAdvisor (**c**ontainer **Advisor** 的縮寫)用於分析並公開執行中容器的資源使用情況和效能資料。cAdvisor 開箱即用地支援暴露 Prometheus 指標。在本指南中,我們將:
- 建立一個本地的多容器 Docker Compose 安裝,分別包含執行 Prometheus、cAdvisor 和 Redis 伺服器的容器。
- 檢視由 Redis 容器產生、由 cAdvisor 收集並由 Prometheus 抓取的一些容器指標。
Prometheus 配置
首先,您需要配置 Prometheus 來抓取 cAdvisor 的指標。建立一個 prometheus.yml 檔案並在其中填入以下配置:
scrape_configs:
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets:
- cadvisor:8080
Docker Compose 配置
現在我們需要建立一個 Docker Compose 配置 ,指定哪些容器是我們安裝的一部分,以及每個容器暴露哪些埠、使用哪些資料卷等等。
在建立 prometheus.yml 檔案的同一資料夾中,建立一個 docker-compose.yml 檔案,並填入以下 Docker Compose 配置:
使用繫結掛載
version: '3.2'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
depends_on:
- cadvisor
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
ports:
- 6379:6379
此配置指示 Docker Compose 執行三個服務,每個服務對應一個 Docker 容器。
prometheus服務使用本地的prometheus.yml配置檔案(透過volumes引數匯入到容器中)。cadvisor服務公開 8080 埠(cAdvisor 指標的預設埠),並依賴於各種本地卷(/、/var/run等)。redis服務是一個標準的 Redis 伺服器。cAdvisor 將自動收集該容器的指標,即無需進行任何額外配置。
要執行此安裝:
docker-compose up
如果 Docker Compose 成功啟動了所有三個容器,您應該會看到類似如下的輸出:
prometheus | level=info ts=2018-07-12T22:02:40.5195272Z caller=main.go:500 msg="Server is ready to receive web requests."
您可以使用 ps 命令來驗證這三個容器是否都在執行:
docker-compose ps
您的輸出將類似於這樣:
Name Command State Ports
----------------------------------------------------------------------------
cadvisor /usr/bin/cadvisor -logtostderr Up 8080/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
備選方案:使用內聯 Docker 配置(遠端部署)
如果您正在管理遠端 Docker 主機,並且更喜歡將所有配置保留在 docker-compose.yml 檔案中(避免需要在主機上管理單獨的配置檔案),則可以使用 Docker 的 configs 特性:
version: '3.8'
configs:
prometheus_config:
content: |
scrape_configs:
- job_name: 'cadvisor'
scrape_interval: 5s
static_configs:
- targets: ['cadvisor:8080']
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
configs:
- source: prometheus_config
target: /etc/prometheus/prometheus.yml
uid: "65534" # Required: numeric UID for 'nobody' user
gid: "65534" # Required: numeric GID for 'nobody' group
mode: 0400 # Required: read-only permissions
depends_on:
- cadvisor
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
ports:
- 6379:6379
重要提示
⚠️ 必填欄位:在使用 Docker configs 時,您必須顯式指定 uid、gid 和 mode 為數值。
uid: "65534"- 數字使用者 ID(65534 = Prometheus 映象中的nobody使用者)gid: "65534"- 數字組 ID(65534 =nobody組)mode: 0400- 檔案許可權(所有者只讀)
省略這些欄位或使用像 "nobody" 這樣的字串值會導致以下錯誤:
strconv.Atoi: parsing "nobody": invalid syntax
探索 cAdvisor Web UI
您可以透過 https://:8080 訪問 cAdvisor Web UI 。您可以在 https://:8080/docker/<container> 探索我們安裝中特定 Docker 容器的統計資訊和圖表。例如,可以透過 https://:8080/docker/redis 訪問 Redis 容器的指標,透過 https://:8080/docker/prometheus 訪問 Prometheus,依此類推。
在表示式瀏覽器中探索指標
cAdvisor 的 Web UI 是一個用於探索 cAdvisor 監控內容的有用介面,但它並不提供探索容器 *指標* 的介面。為此,我們需要使用 Prometheus 的表示式瀏覽器,訪問地址為 https://:9090/graph。您可以在表示式欄中輸入 Prometheus 表示式,它看起來像這樣:

讓我們從探索 container_start_time_seconds 指標開始,該指標記錄了容器的啟動時間(以秒為單位)。您可以使用 name="<container_name>" 表示式根據名稱選擇特定的容器。該容器名稱對應於 Docker Compose 配置中的 container_name 引數。例如,container_start_time_seconds{name="redis"} 表示式顯示了 redis 容器的啟動時間。
注意暴露給 Prometheus 的 cAdvisor 收集的容器指標的完整列表可以在 cAdvisor 文件 中找到。
其他表示式
下表列出了一些其他示例表示式:
| 表示式 | 描述 | 適用於 |
|---|---|---|
rate(container_cpu_usage_seconds_total{name="redis"}[1m]) | cgroup 在過去一分鐘內的 CPU 使用率 | redis 容器 |
container_memory_usage_bytes{name="redis"} | cgroup 的總記憶體使用量(以位元組為單位) | redis 容器 |
rate(container_network_transmit_bytes_total[1m]) | 過去一分鐘內容器透過網路每秒傳送的位元組數 | 所有容器 |
rate(container_network_receive_bytes_total[1m]) | 過去一分鐘內容器透過網路每秒接收的位元組數 | 所有容器 |
總結
在本指南中,我們使用 Docker Compose 在單個安裝中運行了三個獨立的容器:一個 Prometheus 容器從 cAdvisor 容器中抓取指標,而 cAdvisor 容器又收集了 Redis 容器生成的指標。然後,我們使用 Prometheus 表示式瀏覽器探索了幾個 cAdvisor 容器指標。