云计算百科
云计算领域专业知识百科平台

Docker 容器谁在吃 CPU?用 cAdvisor 把资源占用直接看清楚

Docker 容器谁在吃 CPU?用 cAdvisor 把资源占用直接看清楚

前言

Docker 服务刚装两三个时,我基本不会专门想监控这件事,真有问题就先跑 docker stats 看一眼;可容器越来越多以后,这种方式很快就不够用了。主机突然变慢,到底是哪一个容器在吃 CPU?内存为什么一直往上涨?磁盘和网络是不是某个服务在持续读写?这些问题如果只能靠临时命令逐个猜,排障很容易变成“先怀疑一圈再说”。我更希望先有一个简单的资源观察入口,把宿主机和每个容器当前的 CPU、内存、文件系统、网络等数据集中看清楚,再决定下一步查谁。尤其 NAS 上往往同时跑下载、媒体、数据库和各种小服务,只看宿主机总负载,很难直接判断究竟是哪一个容器在拖慢整台机器。

这次我在飞牛 NAS 上通过 Docker 部署 cAdvisor v0.47.0,把容器内部 8080 映射到宿主机 8087,先查看主机资源页,再进入 /docker 和 Subcontainers 逐个看容器状态。确认局域网监控页面能正常使用以后,再安装 cpolar,把 8087 Web 页面提供到公网,先验证随机地址,最后配置固定二级子域名 cadvisor。我不会把一个实时页面直接说成完整监控体系;这次重点就是先把“容器现在用了多少资源、从哪里看”这件事跑通。只有先看得见,后面的日志排查、性能优化和更完整的监控体系才有明确方向。

image-202604031625580481.什么是cAdvisor?

cAdvisor(Container Advisor)是一款用于收集、分析和展示容器资源使用情况的工具。

它更适合解决的不是“自动修复故障”,而是先把容器运行状态变得可见。当前页面可以观察的内容包括:

  • CPU 使用情况;
  • 内存用量;
  • 磁盘 I/O;
  • 网络 I/O;
  • 容器镜像、启动时间、标签等元数据;
  • 宿主机整体资源状态。

cAdvisor 自身以容器或进程运行,通过 Linux 的 cgroups、procfs、sysfs 等机制读取资源统计信息,再通过 Web 页面展示。

这次部署并不继续搭 Prometheus、InfluxDB 或 Grafana,所以我先把它当成一个直接观察当前资源状态的入口,不把“高级可视化、长期历史或告警”一起算进已经完成的范围。

2. 先准备 SSH 和 Docker

2.1 在飞牛打开 SSH

进入飞牛设置页面,开启 SSH 服务。

463c5f2aa280d7887420494b8b8f852e

27abe7f94baeaebc1738b60b1ba78933

e16c7480a399e50f627439329422c5a7

随后通过 Windows PowerShell 或 Mac Terminal 登录飞牛。

2.2 检查 Docker

执行当前命令:

docker -v
systemctl status -v

bc2a0952beed8ca143a171bb000b2b23

这里先确认 Docker 环境已经可用。

当前记录里的 systemctl status -v 保持原样,不在这一步额外替换成其他命令。

3. 部署 cAdvisor

3.1 创建目录

先创建并进入目录:

mkdir -p cadvisor
cd cadvisor/

image-20260403113207819

当前目录只是用来整理部署过程,真正运行 cAdvisor 依赖的是后面的 Docker 容器。

3.2 启动 cAdvisor 容器

执行:

docker run -d –name=cadvisor \\
–privileged \\
–volume=/:/rootfs:ro \\
–volume=/var/run:/var/run:ro \\
–volume=/sys:/sys:ro \\
–volume=/var/lib/docker/:/var/lib/docker:ro \\
–publish=8087:8080 \\
gcr.io/cadvisor/cadvisor:v0.47.0

image-20260403113538926

这条命令里的几个关键点需要看清楚:

  • 容器名:cadvisor
  • 使用 –privileged
  • 挂载 /、/var/run、/sys、/var/lib/docker/
  • 宿主机端口:8087
  • 容器端口:8080
  • 镜像:gcr.io/cadvisor/cadvisor:v0.47.0

也就是说,这次浏览器访问使用的是宿主机上的:

8087

端口。

部署完成以后,在浏览器打开:

http://飞牛IP:8087

image-20260403113605431

页面能正常出现以后,cAdvisor 本地 Web 服务就已经跑起来。

4. 先看宿主机整体资源

当前示例访问:

http://192.168.42.147:8087/containers/

首页可以看到主机层面的资源状态。

image-20260403150535532

这里主要用于观察:

  • CPU;
  • 内存;
  • 文件系统;
  • 网络。

我比较喜欢先从宿主机整体看一眼,因为如果整台 NAS 的资源都很平稳,就没必要一上来把所有容器都逐个翻一遍。

5. 再进入 Docker 容器列表

继续访问:

http://192.168.42.147:8087/docker

image-20260403150650361

这个页面会显示 Docker 的基础信息以及当前正在运行的容器。

在:

Subcontainers

区域里,可以看到当前主机上的容器列表。

点击某一个容器后,就能继续查看它的详细运行状态。

image-20260403150838691

image-20260403150857085

继续往下,还能看到更细的资源数据。

image-20260403150941994

image-20260403151011224

image-20260403151026098

这一层才是我觉得 cAdvisor 真正方便的地方:

主机整体状态 → Docker 容器列表 → 单个容器资源详情

排查时不用先记一堆命令,先从页面里找出“谁明显不对”,再决定是否继续进容器或查日志。

6. cAdvisor 能看资源,但别把它和完整监控平台混在一起

当前介绍还提到,cAdvisor 可以继续和 Prometheus、InfluxDB 等工具集成,并配合 Grafana 做更进一步的展示。

但这次没有继续部署这些组件。

所以我会把当前这套环境理解成:

cAdvisor 负责采集并展示容器资源状态。

如果后面真的要做更完整的历史趋势、统一仪表盘或告警,再在这个基础上继续扩展会更清楚。

这样也能避免一个常见误区:页面能打开、当前指标能看到,不代表完整的历史监控体系已经自动搭好了。

7. 本地监控能用了,再考虑外网访问

cAdvisor 默认是在 NAS 局域网里访问。

如果人在公司、出差,或者需要从外部网络查看家里的容器状态,就要再增加公网入口。

这里 cpolar 的职责很明确:

只把 cAdvisor 的 8087 Web 页面提供到公网。

CPU、内存、磁盘和网络指标仍然由 cAdvisor 采集,cpolar 不参与容器监控本身。

8. 在飞牛安装 cpolar

执行当前安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250725104019896

安装完成以后检查服务状态:

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

服务正常以后,通过主机 IP + 9200 打开 cpolar Web 管理页面。

当前页面同时写到:

http://ip:9200

以及链接目标:

http://localhost:9200/

实际访问时,以当前环境真正能够打开的管理地址为准。

8a6698b1bf26d64ba3645827fbfb1c29

9. 给 cAdvisor 创建随机公网地址

进入【隧道管理 → 创建隧道】。

当前配置为:

  • 隧道名称:cadvisor
  • 协议:http
  • 本地地址:8087
  • 域名类型:随机域名
  • 地区:China Top

image-20260403154005084

创建成功以后,进入在线隧道列表查看生成的公网地址。

image-20260403155223348

从其他电脑或移动设备访问。

image-20260403155430663

页面能够正常打开。

这一层真正验证的是:

cAdvisor 8087 → cpolar 随机公网地址 → 外部浏览器。

前面的章节表述偏开发场景,但这里实际用途是远程查看容器监控页面,所以整条链按远程监控来理解更准确。

10. 长期查看再配置固定二级子域名

随机地址适合先验证公网链路。

如果后面会经常从外部网络查看 cAdvisor,固定入口会更方便。

进入 cpolar 预留页面:

https://dashboard.cpolar.com/reserved

image-20250918151358733

选择保留二级子域名。

当前记录为:

  • 地区:china Top
  • 二级子域名:cadvisor

image-20260403160828451

然后回到【隧道管理 → 隧道列表】,找到对应隧道并编辑。

image-20260403161321462

修改为:

  • 域名类型:二级子域名
  • Sub Domain:填写已经保留的二级子域名
  • 地区:China Top

点击更新image-20260403161406211

更新完成以后,在线隧道列表中的随机地址会切换成固定二级子域名形式。

image-20260403161430556

最后再从任意设备访问。

image-20260403162523993

页面能够正常打开。

总结

cAdvisor 对我来说最实用的地方,不是把 Docker 监控包装成一套很重的运维体系,而是先把最基础的“资源到底被谁用了”这件事看清楚。

这次实际跑通的主线是:

飞牛 SSH → Docker → gcr.io/cadvisor/cadvisor:v0.47.0 → 8087:8080 → 主机资源页 → /docker → Subcontainers → 单容器资源详情 → cpolar → 8087 → 随机公网 → 固定二级子域名 cadvisor。

几个边界也比较明确:

  • 当前真正验证的是 cAdvisor 本地 Web 页面、主机资源、Docker 容器列表和单容器详细状态;
  • Prometheus、InfluxDB、Grafana 只在功能介绍里提到,这次没有继续部署;
  • cpolar 只负责公网 Web 入口,不参与容器资源采集;
  • systemctl status -v 按现有技术步骤保留,没有擅自改写;
  • 固定二级子域名解决的是长期访问入口问题,不会改变 cAdvisor 本身的监控能力。

如果 NAS 上已经跑了不少 Docker 服务,我更建议先把 cAdvisor 这种基础观察入口跑起来。下一次机器突然变慢时,至少不用先猜,先看哪一个容器的 CPU、内存或 I/O 明显异常,再往下查会更有方向。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Docker 容器谁在吃 CPU?用 cAdvisor 把资源占用直接看清楚
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!