使用 Prometheus 监控 Docker 容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是使用 Prometheus 监控 Docker 容器,【编者的话】Prometheus支持深度监控Docker容器的资源和运行特性,多维度查询,聚合Docker监控数据,作者认为Prometheus是最适合基于容器架构的监控系统,其特性是高纬度数据模型和灵活的查询语言 。

本文讲的是使用 Prometheus 监控 Docker 容器【编者的话】Prometheus支持深度监控Docker容器的资源和运行特性,多维度查询,聚合Docker监控数据,作者认为Prometheus是最适合基于容器架构的监控系统,其特性是高纬度数据模型和灵活的查询语言 。

监控 Docker

在容器中运行你所有的服务可以让你充分利用资源并获得更好的性能,每个容器都运行在它们自己的cgroup中,同时Linux内核也给我们提供了各种各样的指标(metrics)。

尽管还有一些其它的Docker监控工具,但接下来我将向你解释为什么我认为SoundCloud最新发布的 Prometheus是最适合监控基于容器的基础设施的。

Prometheus特点是高维度数据模型,时间序列是通过一个度量值名字和一套键值对识别。灵活的查询语言允许查询和绘制数据。它采用了先进的度量标准类型像汇总(summaries)、从指定时间跨度的总数构建比率或者是在有任何异常的时候报警并且没有任何依赖,在中断期间,使它成为一个可靠的系统进行调试。

我会集中讲为什么该数据模型和查询语言如此贴合容器式和动态基础设施,对于这些基础设施,你应该想着整个服务集群而不是单个服务器实例,把服务器想成牛群中的牛而不是各家自养分散开的宠物。

传统方法

比如说你想监控你容器的内存使用率。不支持维度数据的话,这样一个名为 webapp123 的容器的指标,可能被称为 container_memory_usage_bytes_webapp123

但是如果你想展示所有你的 webapp123 容器的内存利用率?更先进的监控解决方案像 graphite 支持这样。它的特性是层次、树状数据模型,这样的指标可能被称为 container.memory_usage_bytes.webapp123。现在你可以使用通配符像 container.memory_usage_bytes.webapp* 来绘制所有你的 ‘webapp’ 容器的内存使用率。Graphite 也支持函数像 sum() 来通过使用一个表达式像sum(container.memory_usage_bytes.webapp*) 聚合你所有服务器上的应用的内存使用率。

这是非常伟大并且有用的,但是有限制性。如果你不想聚合一个给定名字的所有容器而是一个给定镜像的?或者你想把部署你的 canary 同在你生产环境的服务器对比?

可以为每个用例想出一个层次结构,但是没有一个支持它们。现实情况显示,你预先往往不知道哪个问题需要从新回答一次并且你开始研究。

Prometheus

Prometheus 支持维度数据,你可以拥有全局和简单的指标名像 container_memory_usage_bytes ,使用多个维度来标识你服务的指定实例。

我已经创建了一个简单的 container-exporter 来收集 Docker 容器的指标以及输出给 Prometheus 来消费。这个输出器使用容器的名字,id 和 镜像作为维度。额外的 per-exporter 维度可以在 prometheus.conf 中设置。

如果你使用指标名字直接作为一个查询表达式,它将返回有这个使用这个指标名字作为标签的所有时间序列。

container_memory_usage_bytes{env="prod",id="23f731ee29ae12fef1ef6726e2fce60e5e37342ee9e35cb47e3c7a24422f9e88",instance="http://1.2.3.4:9088/metrics",job="container-exporter",name="haproxy-exporter-int",image="prom/haproxy-exporter:latest"}    11468800.000000  
container_memory_usage_bytes{env="prod",id="57690ddfd3bb954d59b2d9dcd7379b308fbe999bce057951aa3d45211c0b5f8c",instance="http://1.2.3.5:9088/metrics",job="container-exporter",name="haproxy-exporter",image="prom/haproxy-exporter:latest"}    16809984.000000  
container_memory_usage_bytes{env="prod",id="907ac267ebb3299af08a276e4ea6fd7bf3cb26632889d9394900adc832a302b4",instance="http://1.2.3.2:9088/metrics",job="container-exporter",name="node-exporter",image="prom/container-exporter:latest"}  
...
...


如果你运行了许多容器,这个看起来像这样。

container_memory_usage_bytes.png



为了帮助你使得这数据更有意义,你可以过滤(filter) and/or 聚合(aggregate) 这些指标。

切片 & 切块(Slice & Dice)

> 注:slice应该是侧重一个完整的数据 ,dice相当于一个一个数据线中的一段。

使用 Prometheus 的查询语言,你可以对你想的任何维度的数据切片和切块。如果你对一个给定名字的所有容器感兴趣,你可以使用一个表达式像 container_memory_usage_bytes{name="consul-server"},这个将仅仅显示 name == "consul-server" 的时间序列。

Prometheus 也支持正则表达式,因此匹配完整的脚本你可以这样做container_memory_usage_bytes{name=~"^consul"},这将展示起来像这样:

container_memory_usage_bytes_consul.png



你也使用使用任何维度过滤,因此你可以获取在一个给定主机,给定环境和给定区域上所有容器的指标。

聚合(Aggregation)

和 Graphite 类似,Prometheus 支持聚合函数但是它的维度更加丰富。使用sum(container_memory_usage_bytes{name=~"^consul"})按预期汇总你所有 "consul-*" 的内存使用率。

现在比如说你想看你的 'consul' 和 'consul-server' 容器平均内存使用率的不同,这可以通过提供维度保存这聚合结果像 avg(container_memory_usage_bytes{name=~"^consul"}) by (name)来实现:

container_memory_usage_bytes_consul_by_name-1.png



如果你在多个区域有服务并且配置了区域名作为一个额外的标签对,你也可以保存维度来展示每个名字和区域的内存使用率,通过使用一个像这样的表达式 :

avg(container_memory_usage_bytes{name=~"^consul"}) by (name,zone)`


使用 Prometheus + Container-Exporter

正如你所知,我喜欢在容器中运行一切,包括 container-exporter 和 Prometheus,运行 container-exporter应该是非常容易的:

docker run -p 8080:8080 -v /sys/fs/cgroup:/cgroup \  
       -v /var/run/docker.sock:/var/run/docker.sock prom/container-exporter


现在你需要安装 Prometheus。关于这个参考官方文档。为了使得 Prometheus 从 container-exporter 拉取指标,你需要把它作为目标添加到配置。比如:

job: {  
name: "container-exporter"
scrape_interval: "1m"
target_group: {
  labels: {
    label: {
        name: "zone"
        value: "us-east-1"
    }
    label: {
        name: "env"
        value: "prod"
    }
}
target: "http://1.2.3.4:8080/metrics"
}
}


现在从新构建你的镜像如文档中描述的那样并启动它。Prometheus 现在应该每 60s 轮询你的 container-exporter。

总结

因为 Prometheus 的灵活性、性能和最小化依赖,所以我选择它作为我的监控系统。这就是为什么从去年起我就使用了Prometheus作为我们监控Docker的主要监控系统。

原文链接:Monitor Docker Containers with Prometheus(翻译:叶可强 审校:宋喻)


原文发布时间为:2015-01-31

本文作者:叶可强

本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:使用 Prometheus 监控 Docker 容器

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
1月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
236 77
|
5天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
52 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
3天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
41 25
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
15天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
21天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
108 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
5天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
45 10
|
27天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
50 3
实战~如何组织一个多容器项目docker-compose
|
1月前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
123 3
|
1月前
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
68 8