一、Docker 監控方式
1.利用docker 的 docker stats API
指令: docker stats [容器ID/容器名稱]
[root@docker ~]# docker stats --help
Usage: docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
-a, --all Show all containers (default shows just running)
--help Print usage
--no-stream Disable streaming stats and only pull the first result
參數:-a, --all 表示檢視所有容器包括已經exit狀态的
--no-stream 表示僅拉取第一次的請求結果後就結束
示例:檢視下某個容器的狀态
[root@docker ~]# docker stats --no-stream cadvisor
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
cadvisor 1.48% 62.48 MB / 3.977 GB 1.57% 4.902 MB / 378 MB 18.93 MB / 0 B
從上面可以看到容器的資源使用,包括CPU、記憶體、記憶體使用率、網絡入口IO、磁盤IO、及記憶體LIMIT。該方式比較簡單明了,就像系統自帶的top指令一樣。
2.利用谷歌開源工具cAdvisor(
官網)
建立容器,如果docker主機上沒有該容器,可能需要喝杯熱茶的時間(去docker hub上下載下傳鏡像,視網速)
[root@docker ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor-test google/cadvisor:latest
建立完成後,可以通路http://主機ip:8080/,如下圖

3.利用獨立開源項目Prometheus監控工具(
),後續有時間會專門對其進行系統學習下。
來自官網資料:Prometheus及其一些生态系統元件的總體架構
二、本文案例開源工具介紹
1.cAdvisor (Container Advisor)該程式是由Google 開源的一個項目。提供了給使用容器的使用者對其主機上運作容器的資源使用情況和性能的了解,它是一個以容器方式運作的守護程序,用來資料采集、彙聚、可視化和導出運作中容器的資訊。具體來說,對于每個容器,它保留資源的隔離參數,曆史資源使用,完整曆史資源使用的直方圖,和網絡統計。此資料由機器上的容器輸出。
2.InfluxDB(
)是一個由Go編寫的開源資料庫,專門用于處理具有高可用性和高性能要求的時間序列資料。InfluxDB安裝沒有外部依賴,可以在幾分鐘内完成,然而它的靈活性、可擴充性足夠複雜的部署。具有實時分析、曆史分析、預測分析、異常檢測等特點。
3.Grafana(
)提供了一個強大而優雅的方式來建立、探索,并可以共享儀表闆和資料。也是用于查詢、可視化時間序列和名額的主要工具。支援的資料源有Graphite、Prometheus、Elasticsearch、InfluxDB、OpenTSDB、AWS CloudWatch等,并且在4.0及更高版本中加入了警報功能(but現在隻支援一些資料源。它們包括Graphite,Prometheus,InfluxDB和OpenTSDB)。目前報警規則隻有Graph面闆支援,Table和Singlestat會在未來版本中出現。支援的通知方式有Email、即時通訊工具Slack、Webhook等。
三、監控部署
1.建立第一個容器influxdb
[root@docker ~]# docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 --name influxsrv -e PRE_CREATE_DB=cadvisor tutum/influxdb:0.13
注:預設情況下,InfluxDB使用以下網絡端口:
TCP端口8083用于InfluxDB的管理面闆
TCP端口8086用于通過InfluxDB的HTTP API進行用戶端 - 伺服器的通信
建立完成後,打開浏覽器,通路http://ip:8083,預設使用者名,密碼是root、root,如下圖
2.建立cAdvisor容器并将其link到InfluxDB容器
[root@docker ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --link influxsrv:influxsrv --name=cadvisor google/cadvisor:v0.24.1 -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
3.建立Grafana容器并将其連結到InfluxDB容器:
docker run -d -p 3000:3000 -e INFLUXDB_HOST=localhost -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=root -e INFLUXDB_PASS=root --link influxsrv:influxsrv --name grafana grafana/grafana:3.1.1
4.打開浏覽器,通路http://ip:3000/ Grafana界面
如有轉載,請注明原文出處。
飛走不可:
http://www.cnblogs.com/hanyifeng/p/6233851.html5.登入上去後,将Influxdb設定為Grafana的資料源,按照下圖添加:
之後點選Add data source,add增加。資訊如下:
最後儲存測試連接配接。
6.我們使用Grafana設定我們的第一個Dashboard,并可視化來自cAdvisor的資料。
首先,添加一個Dashboard:
然後建立一個graph,如下圖:
先設定Graph中的每個标題選項,如下:
Title:Memory
Height:300px
Metrics:輸入查詢語句及選擇資料源,default 已經是influxdb,可以不用設定(點選query 1: SELECT mean("value") FROM "memory_usage" WHERE container_name='cadvisor' AND container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name"
fill(previous)
ALIAS BY:$tag_container_name.memory
Format as:Time series
Axes:主要修改一下Y軸的 顯示機關
Left Y-->Unit:bytes、Y-Min:0
Legend:可以在圖示左下方顯示統計的最大、最小、及平均值等。
Display:主要修改下顯示的波浪線或者點,還可以修改區域的顯示深度(可以按個人喜好)
Mode Options-->Fill:4、LineWidth:2
修改設定完成後,記得點選正上面的儲存
按鈕。完整的一個dashboard就出來了。如下圖:
點選ADD ROW ,可以增加其它監控Graph、Table、Text等。剩下需要監控的如CPU、磁盤IO、網絡IO。建立方式和上面基本一緻,除了左Y軸那裡需要注意下機關。
7.完整的幾個圖,以及查詢語句如下:
cpu 查詢:
SELECT derivative(mean("value"), 10s) FROM "cpu_usage_total" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
網絡 i/o 查詢:
tx:
SELECT derivative(mean("value"), 10s)/8 FROM "tx_bytes" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
rx:
SELECT derivative(mean("value"), 10s)/8 FROM "rx_bytes" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
檔案系統使用及limit:
fs
SELECT mean("value") FROM "fs_usage" WHERE container_name='cadvisor' AND container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
limit
SELECT mean("value") FROM "fs_limit" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
四、總結一下
Docker 容器的監控不容忽視,畢竟裡面是有業務程式在跑的,有了監控,還要有相關預警規則,及報警的處理動作,就像zabbix 一樣。不知道cAdvisor監控Docker 叢集有木有其它的開源技術方案,畢竟Dcoker 伺服器是叢集存在的。下次我找到好的技術方案,再來分享。
如果文中有錯誤,還望大家不吝賜教。
如有轉載,請注明原文出處。
參考資料:
https://segmentfault.com/a/1190000002527178
https://www.brianchristner.io/how-to-setup-docker-monitoring/