Docker 提供多種日誌驅動程式,例如 json-filesyslog,可將容器日誌輸出至不同目標。設定日誌驅動程式可在 Docker 守護行程或容器層級進行,方便集中管理日誌。然而,僅依靠日誌驅動程式並不足以涵蓋所有應用程式訊息,尤其是非 stderrstdout 輸出的訊息。因此,在設計應用程式時,需加入適當的標籤和追蹤機制,才能有效地監控和管理容器。此外,隨著容器數量增加,集中式日誌系統變得至關重要,它能整合 CPU、記憶體和應用效能等資訊,提供更全面的監控視野。docker stats 指令提供容器的即時效能資料,包含 CPU 使用率、記憶體用量等,並可透過 --format 選項自訂輸出格式。Docker 也提供 REST API 供外部工具取得更詳細的容器統計資料。cAdvisor 作為 Google 開發的監控方案,能提供更細緻的容器使用率和效能指標,並具備圖形化介面,方便監控容器狀態。

第10章 容器管理

容器日誌管理

Docker 提供了多種日誌驅動程式(logging driver),可將容器日誌傳送至不同目標。預設的日誌驅動程式為 json-file,可透過以下指令確認:

docker info | grep 'Logging Driver'

輸出結果應為 Logging Driver: json-file

執行以下指令建立 Ubuntu 容器並檢查預設日誌:

docker run -it ubuntu:latest sh

在另一個終端機視窗中,找出容器 ID 並執行以下指令:

docker inspect -f '{{.HostConfig.LogConfig.Type}}' <容器ID>

輸出結果應為 json-file

日誌驅動程式設定

可於 Docker 守護行程(daemon)層級或容器層級變更日誌驅動程式。

  • 在守護行程層級,可修改 /etc/docker/daemon.json 檔案中的 log-driver 值。

{ “log-driver”: “syslog”, “log-opts”: { # syslog 伺服器資訊等選項 } }


*   在容器層級,可於執行容器時指定日誌驅動程式:
    ```bash
docker run -it --log-driver none ubuntu:latest sh

日誌管理考量

容器日誌選項無法涵蓋未透過 stderrstdout 輸出的應用程式或服務訊息。此外,部分日誌驅動程式依賴主機上的服務,可能存在風險。

隨著容器數量增加,需要更複雜的集中式日誌系統,包含 CPU、記憶體和應用效能等資訊。因此,在建構應用程式時,需加入適當的標籤和追蹤功能。

度量收集

本文討論使用 Docker 基本工具和開源工具進行度量收集的方法。

Docker Stats

docker stats 指令提供容器即時效能資料:

docker stats [選項] [容器]

可指定容器 ID 或使用 -a 選項顯示所有容器。若未指定選項,Docker 將顯示所有執行中的容器。

執行以下指令:

docker stats

輸出結果如下圖所示:

CONTAINERCPU %MEM USAGE / LIMITMEM %NET I/OBLOCK I/OPIDS
b4831186f0d40.00%1.98 MiB / 47.08 GiB0.00%0 B / 0 B2.12 MB / 0 B1

可使用 --format 選項自訂輸出格式:

docker stats --format "table {{.Name}}\t{{.ID}}\t{{.CPUPerc}}\t{{.MemUsage}}"

可包含以下度量指標:

  • .Name:容器名稱
  • .ID:容器 ID
  • .CPUPerc:CPU 使用率百分比
  • .MemUsage:記憶體使用量
  • .NetIO:網路 I/O 使用量
  • .BlockIO:區塊 I/O 使用量
  • .MemPerc:記憶體使用率百分比
  • .PIDs:PID 數量

API

Docker 提供 REST API 以取得容器統計資料:

curl --unix-socket /var/run/docker.sock -X GET 'http:/v1.24/containers/<容器ID>/stats'

此 API 端點提供與 docker stats 指令類別似的即時串流資料,但更詳細。

cAdvisor

cAdvisor(Container Advisor)是 Google 開發的監控解決方案,提供詳細的容器使用率和效能度量資料。cAdvisor 本身也是一個容器,可佈署於主機上,收集所有容器的資料。

使用 cAdvisor 的好處

cAdvisor 提供了一個圖形化介面,讓您可以輕鬆監控容器的效能和資源使用情況。

度量收集的最佳實踐

在建構應用程式時,應加入適當的標籤和追蹤功能,以便於監控和管理容器。同時,應考慮使用集中式日誌系統和監控工具,以提高應用程式的可觀察性和可維護性。

容器管理:叢集級監控工具

在容器管理中,監控是確保系統穩定性和效能的關鍵環節。除了單主機監控工具外,叢集級監控工具能夠提供更全面的監控能力,涵蓋整個叢集的資源使用情況和效能指標。

Heapster:Kubernetes的監控利器

Heapster 是由 Google 開發的開源叢集監控工具,主要用於 Kubernetes 環境。它利用 cAdvisor 收集各個節點上的容器資源使用資料,並透過 REST API 將這些資料提供給使用者。Heapster 支援將資料推播到多種後端儲存系統,如 InfluxDB 和 Grafana,以實作資料的視覺化。

Heapster 的工作原理

  1. cAdvisor 整合:在 Kubernetes 中,cAdvisor 被整合到 Kubelet 二進位制檔案中,用於自動發現並收集主機上所有容器的資源使用資料。
  2. 資料匯總:Kubelet 將 cAdvisor 收集的資料匯總,並透過 REST API 提供給 Heapster。
  3. 資料處理與儲存:Heapster 處理並分組這些資料,然後將其推播到組態的後端儲存系統,如 InfluxDB 或 Grafana。

Prometheus:開源監控與警示解決方案

Prometheus 是另一款流行的開源叢集監控和警示工具。它採用提取式模型,即監控代理定期提取目標的資料,而不是由目標主動向代理推播資料。這種模型使得 Prometheus 非常適合監控動態的容器環境。

Prometheus 的主要元件

  • Prometheus 伺服器:負責提取和儲存監控資料,並執行規則以記錄新的時間序列資料或產生警示。
  • Web UI:Prometheus 使用 Grafana 作為圖形前端介面,用於建立高度視覺化和互動式的儀錶板。
  • Push Gateway:允許短暫性服務將指標推播到 Prometheus 伺服器,以彌補提取式模型的限制。
  • Exporter:用於從特定系統中匯出指標的外掛或函式庫,例如 HAProxy 和 Memcached Exporter。
  • Alertmanager:負責處理 Prometheus 伺服器和其他應用程式發出的警示,包括重複資料刪除、分組和路由到指定的通知媒介。

使用 Prometheus 監控 Docker 容器

  1. 啟動 Prometheus:使用 Docker Compose 啟動 Prometheus 伺服器,並組態其監視自身。
version: '2'
networks:
  pk_network:
    driver: bridge
volumes:
  prometheus_data: {}
services:
  prometheus:
    image: prom/prometheus
    container_name: pk_prometheus
    volumes:
      - ./prometheus/:/etc/prometheus/
      - prometheus_data:/prometheus
    command:
      - '-config.file=/etc/prometheus/prometheus.yml'
      - '-storage.local.path=/prometheus'
      - '-storage.local.memory-chunks=100000'
    restart: unless-stopped
    expose:
      - 9090
    ports:
      - 9090:9090
    networks:
      - pk_network
    labels:
      org.label-schema.group: "monitoring for PK containers"
global:
  scrape_interval: 20s
  evaluation_interval: 20s
external_labels:
  monitor: 'Docker-pk-monitor'
scrape_configs:
  - job_name: 'pk_prometheus'
    scrape_interval: 25s
    static_configs:
      - targets: ['localhost:9090']
  1. 執行 Docker Compose:使用以下命令啟動 Prometheus。
docker-compose up -d

詳細解說

  • docker-compose.yml 檔案定義了 Prometheus 服務的組態,包括使用的映像檔、容器名稱、對映的卷、命令引數、重啟策略、暴露的埠以及網路組態。
  • prometheus.yml 組態檔案定義了抓取資料的時間間隔、評估規則的時間間隔,以及外部標籤等。
  • Prometheus 將自身作為監控目標,以演示其自監控能力。

容器管理:使用Prometheus和Grafana進行叢集監控

在現代化的容器化環境中,監控是確保系統穩定執行的關鍵。本章節將探討如何使用Prometheus和Grafana來實作對容器的有效監控。

步驟1:啟動Prometheus服務

首先,我們需要使用Docker Compose來啟動Prometheus服務。透過執行docker-compose up -d命令,我們可以在後台啟動Prometheus容器。

程式碼範例:docker-compose.yml

version: '3'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    networks:
      - pk_network

內容解密:

  • version: '3' 指定了Docker Compose的版本。
  • services定義了要啟動的服務,這裡我們定義了Prometheus服務。
  • image: prom/prometheus:latest 指定了Prometheus的Docker映像。
  • container_name: prometheus 為容器指定了名稱。
  • restart: unless-stopped 設定容器除非被明確停止,否則總是重啟。
  • ports映射了主機的9090埠到容器的9090埠,以便存取Prometheus的Web介面。
  • networks將Prometheus容器加入到pk_network網路中,以便其他容器可以與其通訊。

執行docker ps命令可以確認Prometheus是否成功啟動並執行。

步驟2:新增Node Exporter和cAdvisor

接下來,我們需要在相同的Docker Compose檔案中新增Node Exporter和cAdvisor,以收集應用容器的指標。

程式碼範例:docker-compose.yml(新增服務)

nodeexporter:
  image: prom/node-exporter
  container_name: pk_nodeexporter
  restart: unless-stopped
  expose:
    - "9100"
  networks:
    - pk_network

cadvisor:
  image: google/cadvisor:v0.26.1
  container_name: pk_cadvisor
  volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
  restart: unless-stopped
  expose:
    - "8080"
  networks:
    - pk_network

內容解密:

  • nodeexportercadvisor服務被新增到Docker Compose檔案中。
  • image指定了使用的Docker映像。
  • container_name為容器指定了名稱。
  • restart: unless-stopped確保容器在除非被明確停止,否則總是重啟。
  • expose暴露了容器的埠,但不對映到主機埠。
  • volumes掛載了主機的檔案系統到容器中,以便cAdvisor可以收集指標。
  • networks將這些容器加入到pk_network網路中。

步驟3:新增Targets到Prometheus

我們需要在Prometheus的組態檔案prometheus.yml中新增Node Exporter和cAdvisor作為targets。

程式碼範例:prometheus.yml

scrape_configs:
  - job_name: 'pk_nodeexporter'
    scrape_interval: 15s
    static_configs:
      - targets: ['nodeexporter:9100']
  - job_name: 'pk_cadvisor'
    scrape_interval: 20s
    static_configs:
      - targets: ['cadvisor:8080']

內容解密:

  • scrape_configs定義了Prometheus的抓取組態。
  • job_name指定了任務名稱。
  • scrape_interval設定了抓取指標的時間間隔。
  • static_configs定義了靜態組態,這裡指定了Node Exporter和cAdvisor的targets。

步驟4:啟動Grafana

為了視覺化指標,我們需要在Docker Compose檔案中新增Grafana服務。

程式碼範例:docker-compose.yml(新增Grafana服務)

grafana:
  image: grafana/grafana
  container_name: grafana
  volumes:
    - grafana_data:/var/lib/grafana
  env_file:
    - user.config
  restart: unless-stopped
  ports:
    - "3000:3000"
  networks:
    - pk_network

內容解密:

  • image: grafana/grafana 指定了Grafana的Docker映像。
  • container_name: grafana 為容器指定了名稱。
  • volumes掛載了一個捲到/var/lib/grafana,以儲存Grafana的資料。
  • env_file指定了一個環境變數檔案,用於組態Grafana的管理員使用者。
  • restart: unless-stopped確保容器總是重啟,除非被明確停止。
  • ports映射了主機的3000埠到容器的3000埠,以便存取Grafana的Web介面。

組態Grafana

啟動Grafana後,我們需要組態它來視覺化Prometheus收集的指標。登入Grafana後,新增Prometheus作為資料來源,並組態相關引數。

檢視統計資料

完成上述步驟後,我們就可以在Grafana中檢視Prometheus收集的指標,從而實作對容器的有效監控。