从Docker容器内部获取Linux宿主机运行指标的可行方案咨询
容器内采集宿主机Linux指标的成熟实现方案
业界经过生产验证的标准方案就是你提到的第三种路径,无需在宿主机安装任何额外工具,仅通过容器启动参数配置即可实现全量指标采集,完全适配你无法修改客户宿主机环境的要求。
核心实现逻辑
Linux系统的所有运行指标都通过/proc、/sys两个虚拟文件系统暴露给用户态,只要在启动容器时将宿主机的这两个目录只读挂载到容器内,即可直接读取宿主机的全量指标,不需要调用外部API也不需要额外的同步逻辑。
启动容器时需要添加的参数
docker run \ -v /proc:/host/proc:ro \ -v /sys:/host/sys:ro \ -v /:/host/root:ro \ --pid=host \ <你的容器镜像名>
各参数作用说明:
-v /proc:/host/proc:ro:只读挂载宿主机proc文件系统到容器内/host/proc路径,读取该路径下的文件即可获取宿主机CPU、内存、进程、磁盘IO等核心指标-v /sys:/host/sys:ro:只读挂载宿主机sysfs,可获取更细粒度的块设备、硬件、网络等指标-v /:/host/root:ro:可选配置,用于读取宿主机磁盘分区的使用率数据--pid=host:可选配置,开启后容器内的top、ps等命令可直接看到宿主机全量进程(包含非容器化运行的进程)的运行数据
具体指标采集方式
- 宿主机CPU使用率:读取
/host/proc/stat计算单位时间内的时间片差值即可,性能远高于调用top命令 - 宿主机内存使用率:直接解析
/host/proc/meminfo中的MemTotal、MemAvailable、Buffers、Cached等字段计算 - 磁盘指标:块设备读写统计读
/host/proc/diskstats,分区使用率读取/host/root/proc/mounts获取挂载点后调用statfs计算 - 全量进程指标:开启
--pid=host后直接调用top、ps命令,或读取/host/proc/[pid]/路径下的对应文件即可获取
三种方案的对比评价
- 方案一(外部执行命令同步到容器):额外增加了宿主机侧的定时任务运维成本,存在数据延迟,完全可以被挂载procfs的方案替代,不推荐
- 方案二(调用Docker API取docker stats):仅能获取容器本身的指标,无法覆盖宿主机全局和非容器进程数据,且需要给容器开放Docker套接字访问权限,存在较高安全风险,不推荐
- 方案三(容器内直接获取宿主机数据):是云原生监控领域的通用标准实现,Prometheus的node-exporter等主流监控组件都采用该逻辑,经过大规模生产环境验证,完全不需要修改宿主机环境,是最优解
注意事项
- 所有挂载都使用只读(ro)权限,不会对宿主机文件系统做任何修改,客户侧接受度更高
- 如果是K8s环境,只要在Pod配置中添加对应的volume挂载和
hostPID: true配置即可,逻辑完全一致 - 不需要在容器内安装复杂工具,仅用基础shell命令或自研的文件读取逻辑即可完成采集,稳定性更高
内容的提问来源于stack exchange,提问作者jim stone
相关产品推荐
相关产品推荐

