用 Docker Compose 集成 Prometheus 监控本地容器,核心是通过 cAdvisor + Prometheus 的 Docker SD 自动发现并抓取容器指标,要求容器暴露 /metrics 接口、cAdvisor 运行在 host 网络模式、Prometheus 挂载 /var/run/docker.sock 并正确配置 docker_sd_configs 与 relabel 规则。

用 Docker Compose 集成 Prometheus 监控本地容器,核心是让 Prometheus 能自动发现并抓取容器的指标数据,同时确保被监控容器(如 Nginx、Node.js 应用等)暴露符合 Prometheus 格式的 `/metrics` 接口。不需要手动配置每个容器的 target,靠 cAdvisor + Prometheus 的 Docker SD(service discovery)就能实现。
1. 确保容器启用 Prometheus 指标暴露
不是所有容器默认提供指标。你需要:
-
基础服务自身支持:比如运行官方
prom/node-exporter、google/cadvisor,或你的应用集成了client_golang并监听/metrics(如端口 2000、9090 等) -
暴露端口并允许抓取:在
docker-compose.yml中声明ports(如"9100:9100"),且容器内服务绑定到0.0.0.0(非127.0.0.1),否则 cAdvisor 或 Prometheus 无法从宿主机网络访问 -
添加必要 label(可选但推荐):例如
com.example.monitoring: "true",后续可在 Prometheus 的relabel_configs中过滤
2. 使用 cAdvisor 收集容器基础指标
cAdvisor 是 Google 开发的容器资源监控工具,能自动采集 CPU、内存、网络、磁盘等指标,并自带 /metrics 接口供 Prometheus 抓取。它必须运行在宿主机网络模式下才能获取真实容器数据:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.49.1
container_name: cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- "8080:8080"
network_mode: host # 关键:必须 host 模式
3. 配置 Prometheus 自动发现 Docker 容器
在 prometheus.yml 中启用 docker_sd_configs,让 Prometheus 动态发现正在运行的容器:
scrape_configs:
- job_name: 'cadvisor'
static_configs:
- targets: ['host.docker.internal:8080'] # macOS/Windows;Linux 改为宿主机 IP 或 'localhost:8080'
<ul><li>job_name: 'docker-containers'
docker_sd_configs:<ul><li>host: unix:///var/run/docker.sock
refresh_interval: 10s
relabel_configs:</li><li>source_labels: [<strong>address</strong>]
regex: '(.*):([0-9]+)'
replacement: '${1}:9100' # 假设目标容器 metrics 在 9100 端口
target_label: <strong>address</strong></li><li>source_labels: [__meta_docker_container_name]
regex: '/(.*)'
target_label: container</li><li>source_labels: [__meta_docker_container_status]
target_label: status</li><li>action: keep
regex: true
source_labels: [__meta_docker_container_label_com_example_monitoring]
说明:
-
docker_sd_configs依赖挂载/var/run/docker.sock,因此 Prometheus 容器需加volumes: [- /var/run/docker.sock:/var/run/docker.sock] -
relabel_configs用于重写 target 地址(如把容器 IP + 随机端口映射为固定 metrics 端口)、提取元数据、按 label 过滤 -
host.docker.internal在 Linux 上不可用,需替换为实际宿主机 IP(如172.17.0.1)或使用network_mode: host
4. 编排完整 Compose 文件示例
一个最小可行的 docker-compose.yml:
version: '3.8'
services:
prometheus:
image: prom/prometheus:v2.49.1
container_name: prometheus
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- cadvisor
<p>grafana:
image: grafana/grafana-enterprise:10.3.1
container_name: grafana
ports:</p><ul><li>"3000:3000"
environment:</li><li>GF_SECURITY_ADMIN_PASSWORD=admin
volumes:</li><li>grafana_data:/var/lib/grafana</li></ul><p>cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.49.1
container_name: cadvisor
volumes:</p><ul><li>/:/rootfs:ro</li><li>/var/run:/var/run:ro</li><li>/sys:/sys:ro</li><li>/var/lib/docker/:/var/lib/docker:ro
network_mode: host</li></ul><p>volumes:
prometheus_data:
grafana_data:
启动后访问 http://localhost:9090/targets 查看是否成功发现 cAdvisor 和其他带 metrics 的容器。
不复杂但容易忽略的关键点:cAdvisor 必须 host 网络、Prometheus 必须挂载 docker.sock、容器 metrics 端口要可被宿主机网络访问、relabel 逻辑要匹配你容器的实际结构。


















