You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Docker Compose单个容器设为Prometheus独立监控目标?

可行,但需明确Targets页面的up逻辑 + 两种实现方案

首先明确:Prometheus Targets页面的up状态,是指抓取任务的端点是否可达——你当前看到的是cadvisor服务本身的状态,而非单个容器的运行状态。要实现单个容器的状态告警,有两种方案:

方案一:推荐(用cadvisor指标告警,无需修改Targets结构)

直接利用cadvisor导出的container_up指标(值为1表示容器运行,0表示停止)编写Prometheus告警规则,无需调整Targets显示逻辑,就能让Alertmanager针对单个容器触发告警。

在Prometheus的告警规则文件中添加:

groups:
- name: container_down_alerts
  rules:
  - alert: ContainerStopped
    expr: container_up{job="cadvisor"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "容器 {{ $labels.name }} 已停止"
      description: "服务器 {{ $labels.instance }} 上的容器 {{ $labels.name }} (ID: {{ $labels.container_id }}) 已停止运行超过1分钟。"

配置后,Alertmanager会自动识别每个停止的容器并触发独立告警,完全匹配你的需求。

方案二:让每个容器在Targets页面独立显示(仅视觉需求,无实际告警优势)

如果一定要让每个容器在Targets页面成为独立条目,需在**monitor端(Prometheus)**配置Docker服务发现+relabel规则,但注意:此时Targets的up状态依然是cadvisor服务的状态,而非容器本身的运行状态,只是每个条目会带上容器的专属标签。

步骤如下:

  1. 确保目标服务器开启Docker远程API(或通过socket代理让Prometheus访问Docker API)
  2. 在Prometheus配置文件中添加以下抓取任务:
scrape_configs:
- job_name: 'docker_containers'
  docker_sd_configs:
  - host: tcp://<目标服务器IP>:2375  # 替换为你的服务器IP和Docker API端口
    port: 2375
  relabel_configs:
  # 提取容器名称(去掉开头的/)
  - source_labels: [__meta_docker_container_name]
    regex: '/(.*)'
    target_label: container_name
  # 添加容器ID标签
  - source_labels: [__meta_docker_container_id]
    target_label: container_id
  # 仅保留运行中的容器
  - action: keep
    source_labels: [__meta_docker_container_status]
    regex: running
  # 将所有实例的抓取地址指向cadvisor
  - target_label: __address__
    replacement: '<目标服务器IP>:8080'  # 替换为cadvisor的监听端口

配置后,Targets页面会显示每个运行中的容器作为独立实例,但up状态仍由cadvisor服务是否正常决定,若要告警容器停止,还是得依赖container_up指标。

总结:优先选择方案一,直接用指标告警更高效;方案二仅满足Targets页面的视觉需求,无实际告警价值。

内容的提问来源于stack exchange,提问作者LeifSec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:13:13