使用 Prometheus 监控 Docker 容器

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文讲的是使用 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 容器
目录
相关文章
|
1天前
|
Shell Linux Docker
docker常用命令大全(基础、镜像、容器、数据卷)
这些命令仅仅是 Docker 命令行工具的冰山一角,但对于日常操作来说已经非常全面。通过熟练地使用这些基础命令,用户可以有效地管理 Docker 的镜像、容器、数据卷和网络。随着用户对 Docker 的深入使用,更高级的命令和选项将会变得必需,但上面列出的命令已经为用户提供了一个坚实的起点。对于初学者来说,理解和掌握这些常用命令是深入学习 Docker 的基础。
9 4
docker常用命令大全(基础、镜像、容器、数据卷)
|
3天前
|
Docker Python 容器
容器化技术,特别是Docker,已经成为现代软件开发和部署的重要工具。
容器化技术,特别是Docker,已经成为现代软件开发和部署的重要工具。
38 7
|
3天前
|
Kubernetes 持续交付 开发者
微软Azure云上部署Docker容器的技术实践
【7月更文挑战第15天】Docker与Azure的集成,为开发者提供了一种快速、可扩展和可维护的应用部署方式。通过在Azure平台上部署Docker容器,开发者可以充分利用Azure丰富的云服务和强大的基础设施,实现应用的快速迭代和高效运行。未来,随着Docker和Azure的不断发展和集成,我们可以期待更加便捷和高效的容器化应用部署体验。
|
1天前
|
弹性计算 运维 应用服务中间件
容器的优势,在Docker中运行Tomcat
摘要:了解Docker与虚拟机的区别:虚拟机使用Hypervisor创建完整操作系统,而容器通过namespace和cgroup实现轻量级隔离,共享主机内核。Docker启动快、资源利用率高,适合快速部署和跨平台移植。但安全性相对较低。示例介绍了如何通过Docker搜索、拉取官方Tomcat镜像并运行容器,最后验证Tomcat服务的正常运行。
|
2天前
|
安全 网络协议 云计算
Docker容器网络配置详解
【7月更文挑战第16天】Docker的网络配置是实现容器间以及容器与外部网络通信的基础。通过选择合适的网络模式和配置选项,可以构建高效、安全、可扩展的Docker网络解决方案。
|
1天前
|
Java Scala 流计算
实时计算 Flink版产品使用问题之Docker镜像中的Java路径和容器内的Java路径不一致,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
运维 Ubuntu Docker
Docker镜像和容器使用
【7月更文挑战第2天】Docker 概要:Docker 镜像是只读模板,包含运行应用的环境和代码,像蓝图一样。构建镜像可通过基于现有镜像(如 Ubuntu)安装软件后提交,或使用 Dockerfile 定义构建过程。Docker 容器是镜像的运行时实例,`docker run` 命令可创建并运行容器。常用容器操作包括启动/停止、状态检查和交互式进入。通过端口映射,容器服务可从主机访问,促进应用部署和管理的便捷性。
|
3天前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
35 3
|
15天前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
32 1
|
16天前
|
存储 监控 安全
Docker Compose:轻松实现容器编排的利器
【7月更文挑战第2天】 1. **基础与概念**:服务(多容器实例)、网络(灵活通信)、卷(数据持久化)和配置(安全管理)。 2. **实战指南**:安装Compose,编写`docker-compose.yml`文件,启动应用,并介绍依赖、环境变量、健康检查和数据持久化。 3. **最佳实践**:环境隔离、CI/CD集成、资源管理、日志监控、安全策略及案例分析,展示完整应用栈搭建。
37 1