资讯动态

gopsutil docker包教程:如何获取容器列表与cgroup CPU/内存数据(完整指南)

发布时间:2026/9/19 6:45:11 来源:尧图企业网站定制
gopsutil docker包教程如何获取容器列表与cgroup CPU/内存数据完整指南【免费下载链接】gopsutilpsutil for golang项目地址: https://gitcode.com/gh_mirrors/go/gopsutilgopsutil 是 Go 语言版的 psutil其中 docker/ 子包专门解决一个痛点如何获取容器列表以及如何通过 cgroup 读取 Docker 容器的 CPU 与内存数据。本教程带你快速上手这组 API5 分钟写出一个容器资源监控小工具无需调用任何 HTTP API。 docker包是什么不依赖 Docker API 的容器监控方案gopsutil 的 docker 包只做两件事列出容器直接调用本机docker ps命令解析输出拿到容器 ID、镜像、名称、状态读取 cgroup直接读取 Linux 内核的 cgroup 文件系统/sys/fs/cgroup/获取容器级 CPU 与内存指标。这种方式零外部依赖不需要 Docker Engine API、不需要额外 client 库特别适合自研监控 Agent、K8s/Docker 侧车工具的开发者。⚠️ 注意该功能仅 Linux 平台可用。其他系统上所有函数会直接返回ErrDockerNotAvailable或ErrCgroupNotAvailable错误见 docker/docker_notlinux.go。 快速开始安装与运行环境只需一条命令引入依赖go get github.com/shirou/gopsutil/v4/docker运行环境有两个前提条件说明已安装 Docker CLI容器列表功能依赖docker ps命令需有相应权限cgroup v1读取的是 cgroup v1 的cpuacct和memory控制器文件 获取容器列表GetDockerStat 与 GetDockerIDList两个函数各司其职源码位于 docker/docker_linux.go① GetDockerStat() — 容器详情列表执行docker ps -a含已停止容器返回CgroupDockerStat数组每个元素包含 5 个字段ContainerID完整容器 ID--no-trunc不截断Name容器名Image镜像Status如 Up 2 hoursRunning布尔值判断状态是否包含 Up② GetDockerIDList() — 纯 ID 列表执行docker ps -q只返回正在运行容器的 ID 数组最轻量常作为后续 cgroup 查询的输入。 所有函数都提供WithContext版本如GetDockerStatWithContext支持超时控制长轮询场景推荐优先使用。⚡ 获取 cgroup CPU 数据CgroupCPU 系列CPU 指标对应 docker/docker_linux.go共 4 个函数函数作用返回CgroupCPUDocker(id)按容器 ID 读 CPU 统计Docker 默认路径*CgroupCPUStatCgroupCPUUsageDocker(id)只读 CPU 累计使用时间float64秒CgroupCPU(id, base)自定义 cgroup 基路径*CgroupCPUStatCgroupCPUUsage(id, base)自定义基路径读使用时间float64CgroupCPUStat结构内嵌了cpu.TimesStatUser/System 时间单位秒外加一个Usage字段定义见 docker/docker.go。数据来源cpuacct.statuser/system 时钟cpuacct.usage纳秒累计值换算为秒。两个实用技巧传空字符串作为 containerID表示读取所有 cgroup的汇总数据容器通过 systemd slice 管理时可传containerID docker-id.scope、base /sys/fs/cgroup/cpuacct/system.slice/或者干脆不传 base——包内会自动回退尝试system.slice路径见 getCgroupFilePath。 获取 cgroup 内存数据CgroupMem 系列内存指标见 docker/docker_linux.go。函数签名与 CPU 系列一致CgroupMemDocker(id)→*CgroupMemStatDocker 默认路径CgroupMem(id, base)→ 自定义基路径CgroupMemStat是 docker 包中最丰富的结构共 30 个字段完整定义见 docker/docker.go。新手重点关注这几个高频字段即可字段含义对应 cgroup 文件RSS常驻内存真正占用的物理内存memory.stat的 rssCache页缓存memory.stat的 cacheMemUsageInBytes当前内存用量memory.usage_in_bytesMemLimitInBytes内存上限memory.limit_in_bytesMemMaxUsageInBytes历史峰值用量memory.max_usage_in_bytesPgfault/Pgmajfault缺页 / 大缺页次数memory.statMemFailCnt触碰内存上限次数memory.failcnt 想判断容器是否快触顶对比MemUsageInBytes与MemLimitInBytesMemFailCnt持续增长则说明已经发生 OOM 边缘挤压。结构体实现了String()方法直接打印即得 JSON也内置了 JSON tag序列化毫无障碍。️ 实战组合使用监控单个容器典型工作流就三步这也是 docker/docker_linux_test.go 中官方测试的写法GetDockerIDList()拿到运行中容器 IDCgroupCPUDocker(id)读 CPUCgroupMemDocker(id)读内存。两次采样间隔一个周期、做差值即可算出容器 CPU 占用速率——这是容器监控的标准玩法。 错误处理与安全细节错误触发条件ErrDockerNotAvailable非 Linux 平台或docker命令不存在ErrCgroupNotAvailable非 Linux 平台调用 cgroup 函数invalid container IDcontainerID 含/、\或..路径穿越字符最后一点值得注意包内做了路径穿越防护——传入的容器 ID 若包含路径分隔符或..会直接报错防止拼出 cgroup 基目录之外的文件路径见 docker/docker_linux.go自定义 ID 时避免传入这类字符即可。 小结gopsutil 的 docker 包用极简的方式打通了「容器列表 → cgroup 资源」的监控链路列表GetDockerStat()/GetDockerIDList()CPUCgroupCPUDocker()/CgroupCPUUsageDocker()内存CgroupMemDocker()字段最丰富优先看 RSS 与 Mem 三兄弟结合 gopsutil 其他子包mem/、cpu/采集宿主机数据一个轻量级容器监控工具就齐了。【免费下载链接】gopsutilpsutil for golang项目地址: https://gitcode.com/gh_mirrors/go/gopsutil创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价