前言
传统虚机监控一般采用类似 Zabbix 的方案,但容器出现之后,再使用 Zabbix agent 来采集数据的话就显得有些吃力了,如果每个容器都像 OS 那样监控,则 metric 数量将会非常巨大,而且这些数据很可能几分钟之后就没有意义了(容器已经停止或漂移),且容器的指标汇总更应该是按照 APP 甚至 POD 维度。
如果只是过渡方案,或者想将容器监控统一到公司现有的 Zabbix 中,可以参考 zabbix-docker-monitoring,有很多模板如:zabbix-template-app-docker.xml
参考文章:https://segmentfault.com/a/11…
Docker 原生监控
常用方式:
docker ps/top/logs
docker stats
docker Remote API
docker 伪文件系统
docker stats
该命令默认以流式方式输出,如果想打印出最新的数据并立即退出,可以使用 no-stream=true 参数。
可以指定一个已停止的容器,但是停止的容器不返回任何数据。
例如:
Remote API
Docker Remote API 是一个取代远程命令行界面(rcli)的 REST API 如:curl http://127.0.0.1:4243/containers/json
可以使用 API 来获取监控数据并集成到其他系统,注意不要给 Docker daemon 带来性能负担,如果你一台主机有很多容器,非常频繁的采集可能会大量占据 CPU
伪文件系统
以下操作的环境为:Centos7 系统 docker17.03 版本
docker stats 的数据来自于 /sys/fs/cgroup 下的文件
mem usage 那一列的值,来自于
/sys/fs/cgroup/memory/docker/[containerId]/memory.usage_in_bytes
如果没限制内存,Limit = machine_mem,否则来自于
/sys/fs/cgroup/memory/docker/[id]/memory.limit_in_bytes
内存使用率 = memory.usage_in_bytes/memory.limit_in_bytes
一般情况下,cgroup 文件夹下的内容包括 CPU、内存、磁盘、网络等信息:
如 memory 下的文件有:
几个常用的指标含义:
memory.stat 中的信息是最全的:
更多资料参考:cgroup memory
原理分析:Libcontainer 深度解析
总结
优缺点:
优点:原生,很方便的看到当前宿主机上所有容器的 CPU、内存、网络流量等数据。
缺点:只能统计当前宿主机的所有容器,数据是实时的,没有存储,没有报警,没有可视化。
备注:
1. 如果你没有限制容器内存,那么 docker stats 将显示您的主机的内存总量。但它并不意味着你的每个容器都能访问那么多的内存
2. 默认时 stats 命令会每隔 1 秒钟刷新一次,如果只看当前状态:docker stats –no-stream
3. 指定查看某个容器的资源可以指定名称或 PID: docker stats –no-stream registry 1493
container-monitor-book 系列 : https://yasongxu.gitbook.io/container-monitor/