Docker 提供多種日誌驅動程式,例如 json-file 和 syslog,可將容器日誌輸出至不同目標。設定日誌驅動程式可在 Docker 守護行程或容器層級進行,方便集中管理日誌。然而,僅依靠日誌驅動程式並不足以涵蓋所有應用程式訊息,尤其是非 stderr 和 stdout 輸出的訊息。因此,在設計應用程式時,需加入適當的標籤和追蹤機制,才能有效地監控和管理容器。此外,隨著容器數量增加,集中式日誌系統變得至關重要,它能整合 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
日誌管理考量
容器日誌選項無法涵蓋未透過 stderr 和 stdout 輸出的應用程式或服務訊息。此外,部分日誌驅動程式依賴主機上的服務,可能存在風險。
隨著容器數量增加,需要更複雜的集中式日誌系統,包含 CPU、記憶體和應用效能等資訊。因此,在建構應用程式時,需加入適當的標籤和追蹤功能。
度量收集
本文討論使用 Docker 基本工具和開源工具進行度量收集的方法。
Docker Stats
docker stats 指令提供容器即時效能資料:
docker stats [選項] [容器]
可指定容器 ID 或使用 -a 選項顯示所有容器。若未指定選項,Docker 將顯示所有執行中的容器。
執行以下指令:
docker stats
輸出結果如下圖所示:
| CONTAINER | CPU % | MEM USAGE / LIMIT | MEM % | NET I/O | BLOCK I/O | PIDS |
|---|---|---|---|---|---|---|
| b4831186f0d4 | 0.00% | 1.98 MiB / 47.08 GiB | 0.00% | 0 B / 0 B | 2.12 MB / 0 B | 1 |
可使用 --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 的工作原理
- cAdvisor 整合:在 Kubernetes 中,cAdvisor 被整合到 Kubelet 二進位制檔案中,用於自動發現並收集主機上所有容器的資源使用資料。
- 資料匯總:Kubelet 將 cAdvisor 收集的資料匯總,並透過 REST API 提供給 Heapster。
- 資料處理與儲存:Heapster 處理並分組這些資料,然後將其推播到組態的後端儲存系統,如 InfluxDB 或 Grafana。
Prometheus:開源監控與警示解決方案
Prometheus 是另一款流行的開源叢集監控和警示工具。它採用提取式模型,即監控代理定期提取目標的資料,而不是由目標主動向代理推播資料。這種模型使得 Prometheus 非常適合監控動態的容器環境。
Prometheus 的主要元件
- Prometheus 伺服器:負責提取和儲存監控資料,並執行規則以記錄新的時間序列資料或產生警示。
- Web UI:Prometheus 使用 Grafana 作為圖形前端介面,用於建立高度視覺化和互動式的儀錶板。
- Push Gateway:允許短暫性服務將指標推播到 Prometheus 伺服器,以彌補提取式模型的限制。
- Exporter:用於從特定系統中匯出指標的外掛或函式庫,例如 HAProxy 和 Memcached Exporter。
- Alertmanager:負責處理 Prometheus 伺服器和其他應用程式發出的警示,包括重複資料刪除、分組和路由到指定的通知媒介。
使用 Prometheus 監控 Docker 容器
- 啟動 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']
- 執行 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
內容解密:
nodeexporter和cadvisor服務被新增到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收集的指標,從而實作對容器的有效監控。