Docker 容器監控原理及 cAdvisor 的安裝與使用
生產環境中監控容器的執行狀況十分重要,通過監控我們可以隨時掌握容器的執行狀態,做到線上隱患和問題早發現,早解決。所以今天我就和你分享關於容器監控的知識(原理及工具 cAdvisor)。
雖然傳統的物理機和虛擬機器監控已經有了比較成熟的監控方案,但是容器的監控面臨著更大的挑戰,因為容器的行為和本質與傳統的虛擬機器是不一樣的,總的來說,容器具有以下特性:
- 容器是短期存活的,並且可以動態排程
- 容器的本質是程式,而不是一個完整作業系統
- 由於容器非常輕量,容器的建立和銷燬也會比傳統虛擬機器更加頻繁
Docker 容器的監控方案有很多,除了 Docker 自帶的docker stats命令,還有很多開源的解決方案,例如 sysdig、cAdvisor、Prometheus 等,都是非常優秀的監控工具。
下面我們首先來看下,不借助任何外部工具,如何用 Docker 自帶的docker stats命令實現容器的監控。
使用 docker stats 命令
使用 Docker 自帶的docker stats命令可以很方便地看到主機上所有容器的 CPU、記憶體、網路 IO、磁碟 IO、PID 等資源的使用情況。下面我們可以具體操作看看。
首先在主機上使用以下命令啟動一個資源限制為 1 核 2G 的 nginx 容器:
$ docker run --cpus=1 -m=2g --name=nginx -d nginx
容器啟動後,可以使用docker stats
命令檢視容器的資源使用狀態:
$ docker stats nginx
通過docker stats
命令可以看到容器的執行狀態如下:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f742a467b6d8 0.00% 1.387 MiB / 2 GiB 0.07% 656 B / 656 B 0 B / 9.22 kB 2
從容器的執行狀態可以看出,docker stats
命令確實可以獲取並顯示 Docker 容器執行狀態。但是它的缺點也很明顯,因為它只能獲取本機資料,無法檢視歷史監控資料,沒有視覺化展示皮膚。
因此,生產環境中我們通常使用另一種容器監控解決方案 cAdvisor。
cAdvisor
cAdvisor 是谷歌開源的一款通用的容器監控解決方案。cAdvisor 不僅可以採集機器上所有執行的容器資訊,還提供了基礎的查詢介面和 HTTP 介面,更方便與外部系統結合。所以,cAdvisor很快成了容器指標監控最常用元件,並且 Kubernetes 也整合了 cAdvisor 作為容器監控指標的預設工具。
cAdvisor 的安裝與使用
下面我們以 cAdvisor 0.37.0 版本為例,演示一下 cAdvisor 的安裝與使用。
cAdvisor 官方提供了 Docker 映象,我們只需要拉取映象並且啟動映象即可。
由於 cAdvisor 映象存放在谷歌的 gcr.io 映象倉庫中,國內無法訪問到。這裡我把打好的映象放在了 Docker Hub。你可以使用 docker pull lagoudocker/cadvisor:v0.37.0 命令從 Docker Hub 拉取。
首先使用以下命令啟動 cAdvisor:
$ docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
lagoudocker/cadvisor:v0.37.0
此時,cAdvisor 已經成功啟動,我們可以通過訪問 http://localhost:8080 訪問到 cAdvisor 的 Web 介面。
cAdvisor 首頁
cAdvisor 不僅可以監控容器的資源使用情況,還可以監控主機的資源使用情況。下面我們就先看下它是如何檢視主機資源使用情況的。
使用 cAdvisor 檢視主機監控
訪問 http://localhost:8080/containers/ 地址,在首頁可以看到主機的資源使用情況,包含 CPU、記憶體、檔案系統、網路等資源,如下圖所示。
使用 cAdvisor 檢視容器監控
如果你想要檢視主機上執行的容器資源使用情況,可以訪問 http://localhost:8080/docker/,這個頁面會列出 Docker 的基本資訊和執行的容器情況,如下圖所示。
圖3 Docker 容器
在上圖中的 Subcontainers 下會列出當前主機上執行的所有容器,點選其中一個容器即可檢視該容器的詳細執行狀態,如下圖所示。
總體來說,使用 cAdvisor 監控容器具有以下特點:
-
可以同時採集物理機和容器的狀態
-
可以展示監控歷史資料
瞭解 Docker 的監控工具,你是否想問,這些監控資料是怎麼來的呢?下面我就帶你瞭解一下容器監控的原理。
監控原理
我們知道 Docker 是基於 Namespace、Cgroups 和聯合檔案系統實現的。其中 Cgroups 不僅可以用於容器資源的限制,還可以提供容器的資源使用率。無論何種監控方案的實現,底層資料都來源於 Cgroups。
Cgroups 的工作目錄為/sys/fs/cgroup
,/sys/fs/cgroup
目錄下包含了 Cgroups 的所有內容。Cgroups包含很多子系統,可以用來對不同的資源進行限制。例如對CPU、記憶體、PID、磁碟 IO等資源進行限制和監控。
為了更詳細的瞭解 Cgroups 的子系統,我們通過 ls -l 命令檢視/sys/fs/cgroup
資料夾,可以看到很多目錄:
$ sudo ls -l /sys/fs/cgroup/
total 0
dr-xr-xr-x 5 root root 0 Jul 9 19:32 blkio
lrwxrwxrwx 1 root root 11 Jul 9 19:32 cpu -> cpu,cpuacct
dr-xr-xr-x 5 root root 0 Jul 9 19:32 cpu,cpuacct
lrwxrwxrwx 1 root root 11 Jul 9 19:32 cpuacct -> cpu,cpuacct
dr-xr-xr-x 3 root root 0 Jul 9 19:32 cpuset
dr-xr-xr-x 5 root root 0 Jul 9 19:32 devices
dr-xr-xr-x 3 root root 0 Jul 9 19:32 freezer
dr-xr-xr-x 3 root root 0 Jul 9 19:32 hugetlb
dr-xr-xr-x 5 root root 0 Jul 9 19:32 memory
lrwxrwxrwx 1 root root 16 Jul 9 19:32 net_cls -> net_cls,net_prio
dr-xr-xr-x 3 root root 0 Jul 9 19:32 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Jul 9 19:32 net_prio -> net_cls,net_prio
dr-xr-xr-x 3 root root 0 Jul 9 19:32 perf_event
dr-xr-xr-x 5 root root 0 Jul 9 19:32 pids
dr-xr-xr-x 5 root root 0 Jul 9 19:32 systemd
這些目錄代表了 Cgroups 的子系統,Docker 會在每一個 Cgroups 子系統下建立 docker 資料夾。這裡如果你對 Cgroups 子系統不瞭解的話,不要著急,這裡你只需要明白容器監控資料來源於 Cgroups 即可。
監控系統是如何獲取容器的記憶體限制的?
待續
相關文章
- Docker進階-容器監控cAdvisor+InfluxDB+GranfanaDockerUX
- zabbix容器化安裝及監控docker應用Docker
- 使用 Sysdig 監控您的Docker容器Docker
- 《docker高階篇(大廠進階):7.Docker容器監控之CAdvisor+InfluxDB+Granfana》DockerUX
- 使用cAdvisor+Influxdb+Grafana監控系統UXGrafana
- (四)Docker安裝使用容器Docker
- 使用 Docker 安裝 Zabbix,並配置自定義監控項Docker
- Munin監控的安裝與配置
- Docker的安裝與容器應用部署Docker
- Docker安裝及使用Docker
- Docker 容器監控系統初探Docker
- docker08容器監控工具-WeaveScopeDocker
- docker安裝mongoDB及使用DockerMongoDB
- Docker安裝與使用Docker
- Docker容器的自動化監控實現Docker
- 如何監控docker容器內的服務程式Docker
- Docker的架構原理和安裝以及基本管理(映象與容器的建立,刪除,匯入及匯出 )Docker架構
- Linux 下的 Docker 安裝與使用 Docker-compose 安裝LinuxDocker
- docker容器安裝MySQLDockerMySql
- docker容器安裝vimDocker
- 使用iptables管控docker容器Docker
- Docker容器視覺化監控中心搭建Docker視覺化
- JVM調優——JVM監控工具jvisualvm的使用及GC外掛安裝JVMLVMGC
- Docker的安裝配置及使用詳解Docker
- Docker容器的原理與實踐 (下)Docker
- 伺服器安裝docker 以及使用docker安裝mysql及svn伺服器DockerMySql
- 【監控】Zabbix安裝
- docker 容器安裝配置 headscaleDocker
- Docker使用及原理Docker
- Docker 容器搭建及 Redis 叢集原理DockerRedis
- Linux下Zabbix5.0 LTS監控基礎原理及安裝部署(圖文教程)Linux
- macOS docker/laradock 安裝與使用MacDocker
- docker安裝及解除安裝Docker
- 海康安防產品-[監控]影片監控原理介紹
- Zabbix監控安裝部署
- 《docker高階篇(大廠進階):7.Docker容器監控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什麼、compose容器編排,一套帶走DockerUX
- 利用TICK搭建Docker容器視覺化監控中心Docker視覺化
- 詳解Docker容器視覺化監控中心搭建Docker視覺化