首頁

目前文章總數:190 篇

  

最後更新:2025年 07月 26日

0019. Ubuntu 上 Docker 容器化搭建監控平台:Grafana + Prometheus + cAdvisor 持久化監控容器 CPU & 記憶體

日期:2025年 09月 06日

標籤: Linux Ubuntu Docker Docker-Compose Container Grafana Prometheus cAdvisor

摘要:資訊筆記


應用所需:1. Linux 主機(本篇 Linux Ubuntu 22.04 作業系統)
     2. 已安裝 Docker
     3. 已安裝 Dotnet SDK 8.0 以上版本(本篇範例使用)
解決問題:1. 如何在 Ubuntu 搭建資料視覺化監控**容器**平台套件
     2. 可監控 Container 的資源使用狀況,並且有歷史資料與趨勢分析
相關參考:0014. Ubuntu 上 Docker 容器化搭建監控平台:Grafana + Prometheus + Node Exporter 監控 CPU & 記憶體
相關參考:0009. 使用 Google cAdvisor 監控 Docker 容器資源:輕量級監控工具搭建與教學
基本介紹:本篇分為 4 大部分。
第一部分:介紹組件架構
第二部分:安裝 Grafana + Prometheus + cAdvisor
第三部分:配置 Grafana Source Dashboard
第四部分:DEMO成果






第一部分:介紹組件架構

Step 1:前言

本篇會用到 Grafana、Prometheus、cAdvisor 組成可視覺化的監控
上述的組件都可參考之前的文章,都有詳細介紹與說明
相關參考:0014. Ubuntu 上 Docker 容器化搭建監控平台:Grafana + Prometheus + Node Exporter 監控 CPU & 記憶體
相關參考:0009. 使用 Google cAdvisor 監控 Docker 容器資源:輕量級監控工具搭建與教學



Step 2:組件基礎架構

目標 : 可以透過 Grafana 監控已安裝 cAdvisor 的機器,並且該機器-容器(Container)的 CPU,記憶體資源變成持久化資料(歷史資料),因此整體的架構如圖:
對應圖片,由用戶發起查詢有以下對應流程:

1. 用戶進行查詢
2. 機器收到後呼叫 Grafana 服務
3. Grafana 服務收到後呼叫 Prometheus
4. Prometheus 服務收到後將紀錄資料回傳給 Grafana
5. 最終用戶可以看到查詢的結果


其中 Prometheus 會持續向 cAdvisor 索取資料,來進行紀錄
整個架構圖與之前文章相比是將 Node Exporter 組件改為 cAdvisor


Step 3:本篇範例目標架構

實際上在生產環境中,可能有 SLB (負載均衡),這時會有多台機器的情況,因此我們會模擬出 2 台機器
並且只在一台機器上安裝 Grafana (備註:通常監控機器應會在另 1 台 Server 獨立安裝,這邊為了演示,安裝在其中一台機器)
以下是 2 台機器的工作:

192.168.51.93 主機 工作內容
1. 安裝 Grafana
2. 安裝 Prometheus
3. 安裝 cAdvisor


192.168.51.94 主機 工作內容
1. 安裝 cAdvisor


實際維運時所有被監控機器都要安裝 cAdvisor ,只有 Grafana 監控機器需安裝 Prometheus




第二部分:安裝 Grafana + Prometheus + cAdvisor

Step 1:Grafana 監控機 - 準備 docker-compose.yml - 1

以下 docker-compose.yml 是 Grafana + Prometheus + cAdvisor 3 種容器的合成,可以協助一鍵部署
以下 .yml 檔案,需注意開啟的 Port 號,Prometheus 的 Port:9090 ; grafana 的 Port:6060
使用者應依照自己的環境而更換 Port 號,避免與現有使用的 Port 產生衝突

version: '3.8'

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
      - "6060:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    privileged: true
    devices:
      - /dev/kmsg
    command:
      - '--housekeeping_interval=10s'
      - '--storage_duration=60m'
      - '--docker_only=true'

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
      - '--web.enable-lifecycle'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin

volumes:
  prometheus_data:
  grafana_data:



Step 2:Grafana 監控機 - 準備 docker-compose.yml - 2

延續 Step 1. 其中 Prometheus 因為需要針對監控的機器,因此獨立拉出 .yml 檔案便於說明與使用
以下是 prometheus.yml 的內容,每 10s 進行輪詢
並且依照 監控目標 的不同,而有不同的設定

job_name 說明
192.168.51.93_Monitor Prometheus 安裝於此機器,因此需要定義
192.168.51.93_Slave 監控 192.168.51.93 使用 Port:6060 的 cAdvisor
192.168.51.94_Slave 監控 192.168.51.94 使用 Port:6060 的 cAdvisor
global:
  scrape_interval: 10s
  evaluation_interval: 10s

scrape_configs:
  - job_name: '192.168.51.93_Monitor'
    static_configs:
      - targets: ['192.168.51.93:9090']

  - job_name: '192.168.51.93_Slave'
    static_configs:
      - targets: ['192.168.51.93:6060']
        labels:
          machine: 'machine-51.93'
          location: '192.168.51.93'
    scrape_interval: 10s
    metrics_path: /metrics
    
  - job_name: '192.168.51.94_Slave'
    static_configs:
      - targets: ['192.168.51.94:6060']
        labels:
          machine: 'machine-51.94'
          location: '192.168.51.94'
    scrape_interval: 10s
    metrics_path: /metrics



Step 3:Grafana 監控機 - 將檔案複製到目錄

將 Step 1, Step 2. 產生的 docker-compose.yml 與 prometheus.yml 放到遠端的 Ubuntu 主機上
備註:我這邊用主機是內部主機 192.168.51.93


Step 4:Grafana 監控機 - 安裝

到檔案存放的目錄下 -> 輸入以下 Shell 指令進行一鍵安裝,至此 192.168.51.93 監控機(含被監控)安裝完成

docker-compose up -d




Step 5:Grafana 被監控機 - 準備 docker-compose.yml

另一台被監控機 192.168.51.94 ,只負責被監控容器,因此只需要安裝 cAdvisor 即可,以下是 .yml 檔案內容

version: '3.8'

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
      - "6060:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    privileged: true
    devices:
      - /dev/kmsg
    command:
      - '--housekeeping_interval=10s'
      - '--storage_duration=60m'
      - '--docker_only=true'



Step 6:Grafana 被監控機 - 將檔案複製到目錄

將 Step 5. 的 docker-compose.yml 放到遠端的 Ubuntu 主機上
備註:我這邊用主機是內部主機 192.168.51.94


Step 7:Grafana 被監控機 - 安裝

到檔案存放的目錄下 -> 輸入以下 Shell 指令進行一鍵安裝,至此 192.168.51.94 被監控機安裝完成

docker-compose up -d




Step 8:檢查 cAdvisor 容器是否啟動

可以進入安裝的主機確認是否已安裝成功

http://192.168.51.93:6060
http://192.168.51.94:6060

如下圖,若連到 WebUI 表示 cAdvisor 已 Running


若有安裝 Portainer 也可以檢視到所有安裝的容器是否運行




第三部分:配置 Grafana Source Dashboard

Step 1:登入 Grafna

首次安裝完成 Grafana 後,預設帳號密碼為 admin / admin

http://192.168.51.93:3000




Step 2:設定 Prometheus 為資料來源

左側 Connections -> Data Sources -> 選擇 Prometheus


Step 3:設定 Prometheus 為資料來源 - 設定 URL

Name 可以依自己方便分辨設定,Port 來源依照 docker-compose.yml 中配置的主機 + Port 號

http://192.168.51.93:9090


完成後保存,即設定完成


Step 4:匯入合適的 Grafana Dashboard

可以去Grafna Dashboard網站找尋合適的儀錶板
只要是符合組件 Grafana + Prometheus + cAdvisor 都可以匯入,找尋符合團隊需求的面板來監控
這邊推薦用 ID : 21361 的儀錶板,有包含針對 cAdvisor 的 CPU、記憶體、Network 做監控,都符合我們的目標
並且還提供了,當前監控機器的容器是否保持運行的監控
依序填入 ID -> Load -> Import


Step 5:來源為 Prometheus

資料來源使用 Prometheus 就會蒐集所有監控機器的 cAdvisor 的容器資源狀況




第四部分:DEMO成果

Step 1:進入儀錶板 - 檢視監控

左側選擇 DashBoard -> 進入我們剛剛建立的儀表板 (Grafana DashBoard ID: 21361)
可以看到完整的資源的歷史紀錄,這是單純用 cAdvisor 無法實現的事情
補充:這邊看到的畫面與匯入的 DashBoard 有關係,若不是 21361 會有不同的畫面


Step 2:進入儀錶板 - 可選擇機器

儀錶板的上方有 Dropdown List ,可以選擇想要檢視的機器,預設為 All
這邊選擇 192.168.51.93


Step 3:進入儀錶板 - 進入機器後可選擇容器

選擇機器後,還可以針對個別容器進行監控檢查,這邊隨意選擇一項 Container


Step 4:進入儀錶板 - 檢視單一容器

可以清楚的知道單一容器的 CPU、Memory、Network


Step 5:進入儀錶板 - 檢視該機器所有容器運行狀態

並且拉到最下方,可以檢視到該機器(當前 192.168.51.93) 有在 Running 的容器


Step 6:Demo 成功 - 解決了問題

Grafana + Prometheus + cAdvisor 組合的實現,讓生產維運的穩定性更高,並且也解決單純用 cAdvisort 無法保持監控歷史紀錄、資源趨勢的問題
未來在生產維運出現系統異常時,更容易讓開發團隊協助排查原因。

組合 是否適合壓力測試與歷史分析? 原因
Grafana + Prometheus + cAdvisor 非常適合 即時顯示 + 歷史查詢 + 自定告警
❌ 單獨 cAdvisor 不適合 沒有歷史紀錄、查詢能力、告警能力