Docker 监控体系总结
Docker 监控体系总结
一、监控背景与必要性
随着线上服务全面容器化,传统物理机监控无法区分单个物理机上多个容器的资源占用情况,无法满足容器化环境下的精细化监控需求,因此需针对性的 Docker 监控方案
二、Docker 自带监控工具
Docker 内置ps
、top
、stats
三个子命令,适用于快速了解容器实时状态,但存在数据维度有限、无历史数据记录的缺陷
命令 | 功能 | 示例(核心输出) | 优缺点 |
---|---|---|---|
docker ps | 查看当前运行的容器列表 | 展示容器 ID(CONTAINER ID)、镜像(IMAGE)、创建时间(CREATED)、状态(STATUS)等 | 优点:快速查看运行中容器;缺点:仅显示基础状态,无资源数据 |
docker top [容器名] | 查看指定容器内运行的进程 | 展示进程 UID、PID、PPID、CMD 等(如 nginx 的 master/worker 进程) | 优点:定位容器内进程;缺点:仅实时进程信息,无资源占用 |
docker stats | 实时显示所有容器资源使用情况 | 包含 CPU 使用率、内存使用 / 可用量、网络 IO、磁盘 IO | 优点:实时资源数据全面;缺点:无历史趋势,容器未指定内存 limit 时显示主机总内存,易误导 |
三、主流 Docker 监控解决方案:cAdvisor+Prometheus+Grafana
该组合是目前主流方案,分工明确:cAdvisor 负责数据采集、Prometheus 负责数据存储与作为数据源、Grafana 负责可视化展示,解决了自带工具无历史数据、展示简陋的问题
(一)组件功能与定位
组件 | 开发方 | 核心功能 | 定位 |
---|---|---|---|
cAdvisor | Google(开源) | 1. 采集 Docker host 和容器两层监控数据;2. 记录历史变化数据;3. 支持将数据导出给第三方工具 | 监控数据收集器(强项:数据采集与导出;弱项:自带展示界面简陋,仅支持单主机监控) |
Prometheus | 最初由 SoundCloud 开发(开源) | 1. 时间序列数据库,存储 cAdvisor 采集的数据;2. 通过 HTTP 协议周期性抓取被监控组件状态;3. 支持多种 exporter(如 Nginx、MySQL、Linux 系统等) | 数据源与数据存储中心,适配 Docker/K8s 等虚拟化环境 |
Grafana | 开源 | 1. 可视化仪表盘(Dashboard),支持多种数据源;2. 提供丰富图形化选项、日夜模式、自定义布局;3. 直观展示 CPU、内存、IO 等资源趋势 | 前端展示工具,实现监控数据的可视化与多维度分析 |
(二)组件部署步骤(基于 Docker 部署)
1. cAdvisor 部署
- 拉取镜像:
docker pull google/cadvisor
- 启动容器(挂载主机关键目录,暴露 8080 端口):
docker run -d -v /:/rootfs:ro -v /var/run:/var/run:ro -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -v /dev/disk/:/dev/disk:ro -p 8080:8080 --detach=true --name=cadvisor --privileged --device=/dev/kmsg google/cadvisor
- 验证:访问
http://[主机IP]:8080/containers/docker
,查看 host 和容器监控界面
2. Prometheus 部署
-
准备配置文件:
- 创建目录:
mkdir -p /etc/prometheus
- 编写
prometheus.yml
(添加 cAdvisor 为数据源,设置抓取间隔 15s):
global:scrape_interval: 15sevaluation_interval: 15s alerting:alertmanagers:- static_configs:- targets: rule_files: scrape_configs: - job_name: 'prometheus'static_configs:- targets: ['localhost:9090'] - job_name: 'cadvisor'static_configs:- targets: ['[cAdvisor所在主机IP]:8080']
- 授权配置文件:
chmod 777 /etc/prometheus/prometheus.yml
- 时钟同步:
systemctl restart chronyd && systemctl enable chronyd
(避免时间不一致导致数据异常)
- 创建目录:
-
拉取并启动容器(挂载配置文件,启用远程热加载):
docker pull prom/prometheus
docker run -itd --name=prometheus -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle
- 验证:访问
http://[主机IP]:9090/targets
,确认prometheus
和cadvisor
数据源状态为 “UP”
3. Grafana 部署
- 拉取并启动容器(暴露 3000 端口):
docker pull grafana/grafana
docker run -itd --name=grafana -p 3000:3000 grafana/grafana
- 初始化与配置:
- 访问
http://[主机IP]:3000/login
,默认账号密码均为admin
,首次登录需重置密码 - 添加数据源:点击 “Add data source”→选择 “Prometheus”→填写 URL 为
http://[Prometheus所在主机IP]:9090
→点击 “Save & Test” - 导入 Docker 监控仪表盘:点击左侧 “+”→“Import”→输入仪表盘 ID “193”→选择 Prometheus 数据源→点击 “Import”
- 访问
- 验证:导入后即可查看容器 CPU、内存、IO 等资源的可视化监控画面
具体示例:
随着线上服务的全面容器化,对Docker容器的监控就很重要了。传统的监控系统是物理机的监控,在一个物理机跑多个容器的情况 下 , 我 们 是 没 法 从 一 个 监 控 图 表 里 面 区 分 各 个 容 器 的 资 源 占 用 情 况 的 。 为 了 更 好 的 监 控 容 器 运 行 情 况 , 建 议 采 用cAdvisor+Prometheus+Grafana组合进行Docker监控,或者采用cAdvisor+InfluxDB+Grafana组合进行Docker监控。首先我们先学
习Docker自带的几个监控子命令:ps、top和stats。Docker 自带的监控子命令如下:
docker ps是我们早已熟悉的命令了,方便我们查看当前运行的容器,示例如下:
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e53e21f3c58 nginx:latest "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp test123
76e7e71eb37f portainer/portainer "/portainer" 44 minutes ago Up 44 minutes 8000/tcp, 9443/tcp, 0.0.0.0:9001->9000/tcp, :::9001->9000/tcp syportainer
9b7bf30d7fd9 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/uifd/ui-for-docker:latest "/ui-for-docker" 3 hours ago Up 3 hours 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp dockerui
如果想知道某个容器中运行了哪些进程,可以执行docker top命令,示例如下:
[root@docker ~]# docker top test123
UID PID PPID C STIME TTY TIME CMD
root 18210 18188 0 19:30 ? 00:00:00 nginx: master process nginx -g daemon off;
101 18283 18210 0 19:30 ? 00:00:00 nginx: worker process
101 18284 18210 0 19:30 ? 00:00:00 nginx: worker process
101 18285 18210 0 19:30 ? 00:00:00 nginx: worker process
101 18286 18210 0 19:30 ? 00:00:00 nginx: worker process
docker stats用于显示每个容器各种资源的使用情况,示例如下:
[root@docker ~]# docker statsCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2e53e21f3c58 test123 0.00% 5.238MiB / 3.84GiB 0.13% 656B / 0B 33.4MB / 21.5kB 5
76e7e71eb37f syportainer 0.02% 22.95MiB / 3.84GiB 0.58% 2.89MB / 6.63MB 0B / 2.84MB 7
9b7bf30d7fd9 dockerui 0.00% 4.012MiB / 3.84GiB 0.10% 39.3kB / 1.25MB 0B / 0B 5
cAdvisor部署
cAdvisor是google开发的容器监控工具,下面部署cAdvisor,示例如下,基于docker部署cAdvisor,对外提供8080服务端口号
[root@docker ~]# docker pull google/cadvisor
Using default tag: latest
latest: Pulling from google/cadvisor
ff3a5c916c92: Pull complete
44a45bb65cdf: Pull complete
0bbe1a2fe2a6: Pull complete
Digest: sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04
Status: Downloaded newer image for google/cadvisor:latest
docker.io/google/cadvisor:latest
[root@docker ~]# docker run -itd --name cadvisor -v /:/rootfs:ro -v /var/run:/var/run:ro -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -v /dev/disk:/dev/disk:ro -p 8080:8080 --detach=true --privileged --device=/dev/kmsg google/cadvisor:latest
5bad33a52a1cb3d28f8fa5466e22ab9dec0cd7f8cafe15b5e4fb0b6aa2aa39bd
部署完毕后,访问http://ip:8080/containers/docker,即可看到监控界面。如图1所示,显示的是
Docker host的监控。如图2所示,显示的是docker容器的监控
prometheus部署
基于docker部署Prometheus,需要先编写Prometheus配置文件,将cAdvisor数据源添加进来,然后做好时钟同步,示例如下:
[root@docker ~]# mkdir /etc/prometheus
[root@docker ~]# cd /etc/prometheus/
[root@docker prometheus]# vim prometheus.yml
global:scrape_interval: 15sevaluation_interval: 15s
alerting:alertmanagers:- static_configs:- targets:
rule_files:
scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']- job_name: 'cadvisor'static_configs:- targets: ['192.168.100.10:8080']
~
~
[root@docker prometheus]# chmod 777 prometheus.yml
[root@docker prometheus]# systemctl restart chronyd
[root@docker prometheus]# systemctl enable chronyd
Created symlink from /etc/systemd/system/multi-user.target.wants/chronyd.service to /usr/lib/systemd/system/chronyd.service.
[root@docker prometheus]# hwclock -w
部署Prometheus,将编辑好的文件映射到容器中,启动时加上–web.enable-lifecycle的作用是启用远程热加载配置文件,在修改prometheus配置文件后不用重启容器即可生效
[root@docker ~]# docker pull prom/prometheus
Using default tag: latest
latest: Pulling from prom/prometheus
9fa9226be034: Pull complete
1617e25568b2: Pull complete
15e2cd5823b3: Pull complete
d14d9311398e: Pull complete
4314b14247f8: Pull complete
03def9af9150: Pull complete
7dc70dd519ad: Pull complete
92fd369f57f0: Pull complete
0357ac67262f: Pull complete
e9fa37e588a8: Pull complete
Digest: sha256:76947e7ef22f8a698fc638f706685909be425dbe09bd7a2cd7aca849f79b5f64
Status: Downloaded newer image for prom/prometheus:latest
docker.io/prom/prometheus:latest
[root@docker ~]# docker run -itd --name prometheus -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:latest --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle
2fe2e9bfc663eac343a3b36f53f93f578595c8f7b49346109c997845d15297ec
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2fe2e9bfc663 prom/prometheus:latest "/bin/prometheus --c…" 4 seconds ago Up 3 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
如图所示,部署完毕后,访问http://ip:9090/targets,可以看到两个数据源已经UP,其中一个就是cAdvisor:
Grafana部署
Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。其项目官方地址为https://grafana.com
基于Daocker部署Grafana,示例如下:
[root@docker ~]# docker pull grafana/grafana
Using default tag: latest
latest: Pulling from grafana/grafana
9824c27679d3: Pull complete
f28af41ca6c1: Pull complete
08b443d0d1f0: Pull complete
01a7b2849125: Pull complete
b24c04af690f: Pull complete
f04b4ef9a69c: Pull complete
0a5ad0679b58: Pull complete
41d23bd5dd1c: Pull complete
ef84c8d2bf22: Pull complete
f671127533d7: Pull complete
Digest: sha256:74144189b38447facf737dfd0f3906e42e0776212bf575dc3334c3609183adf7
Status: Downloaded newer image for grafana/grafana:latest
docker.io/grafana/grafana:latest
[root@docker ~]# docker run -itd --name grafana -p 3000:3000 grafana/grafana
e1ecb131b7abe95cfb4d33bcc6c32a642b6d425df7be0b29f876a85dcaf8966c
部署完毕后,访问http://ip:3000/login,默认账号密码都是admin,如图所示。接下来Grafana会强制用户重新设置登陆密码,如图所示:
如图所示,登陆成功后,点击Add data source,创建数据源。或者点击左侧设置图标,也可以创建数据源:
如图所示,点击第一个Prometheus:
如图所示,填写数据源信息,在URL填写http://ip:9090,点击Save & Test:
如图所示,添加仪表盘,鼠标移到左侧的加号位置,点击Import,输入ID号:193:
如图所示,点击空白处,就会自动从Grafana官网下载所对应的仪表盘,在prometheus处,选择数据源,点击Import:
接下来既可以看到docker容的监控画面,会显示每个容器对CPU、内存和IO的使用情况,如图所示:
四、关键注意事项与总结
- 核心结论:cAdvisor+Prometheus+Grafana 是 Docker 监控的优选方案,弥补了自带工具的不足,实现 “采集 - 存储 - 展示” 全流程监控
- 组件分工:cAdvisor(采集)、Prometheus(存储)、Grafana(展示),需明确各组件定位,确保部署配置正确
- 常见问题:若 Grafana 无数据,优先检查 Docker host 与本地机器的时间同步(需通过
chronyd
确保时间一致) - 监控价值:帮助 Linux 系统工程师实时掌握容器运行状态,通过历史数据分析容器资源趋势,保障容器化服务稳定运行