Prometheus + Grafana 监控 Docker 容器部署文档
文档信息
| 文档版本 | v1.0 |
| 适用环境 | Linux(Ubuntu/Debian/CentOS) |
| 部署方式 | Docker Compose(容器化部署) |
| 监控目标 | Docker 容器(CPU/内存/网络/磁盘)+ 主机资源 |
| 依赖组件 | Docker 20.10+、Docker Compose 2.0+ |
一、部署前提
1.1 环境要求
- 操作系统:Linux 内核 3.10+(推荐 Ubuntu 20.04/CentOS 7+)
- 已安装 Docker 和 Docker Compose(安装教程见附录)
- 端口占用检查:确保 9090(Prometheus)、3000(Grafana)、9100(Node Exporter)、9126(cAdvisor)未被占用
- 硬件要求:最低 2C4G(生产环境建议 4C8G,支持 100+ 容器监控)
1.2 网络要求
- 内网环境:无需外网(已提前拉取镜像)
- 外网环境:可自动拉取所需 Docker 镜像
1.3镜像拉取网站(国内镜像站点)
- https://docker.aityp.com/
- 以下用到的所有镜像都可在此网站里找到

二、部署架构说明
2.1 组件说明
| Prometheus | 核心监控系统,负责指标采集、存储、查询 | 9090 | 9090:9090 |
| cAdvisor | 容器指标采集器(CPU/内存/网络/磁盘) | 8080 | 9126:8080 |
| Node Exporter | 主机指标采集器(CPU/内存/磁盘/Swap) | 9100 | 9100:9100 |
| Grafana | 可视化面板,展示监控数据 | 3000 | 3000:3000 |
2.2 数据流向
Docker 容器 → cAdvisor 采集容器指标 → Prometheus 拉取并存储指标 → Grafana 从 Prometheus 读取数据并可视化展示;同时 Node Exporter 采集主机指标,补充容器运行环境监控。
三、部署步骤
3.1 环境准备
3.1.1 检查 Docker 环境
# 检查 Docker 版本
docker –version
# 检查 Docker Compose 版本
docker compose version
若未安装,参考附录 A 完成 Docker 和 Docker Compose 安装
3.1.2 创建部署目录
# 创建工作目录(统一管理配置文件和数据)
mkdir -p /opt/prometheus-docker && cd /opt/prometheus-docker
3.2 编写配置文件
3.2.1 编写 docker-compose.yml
在 /opt/prometheus-docker 目录下创建 docker-compose.yml 文件:
version: '3.8'
services:
# Prometheus 核心服务
prometheus:
image: prom/prometheus:v2.45.0 # 稳定版本,兼容主流插件
container_name: prometheus
restart: always # 容器异常自动重启
ports:
– "9090:9090"
volumes:
– ./prometheus.yml:/etc/prometheus/prometheus.yml # 配置文件挂载
– prometheus–data:/prometheus # 监控数据持久化
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'
networks:
– prom–net # 自定义网络,组件间通信
# cAdvisor 容器指标采集器
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
container_name: cadvisor
restart: always
ports:
– "9126:8080" # 避免端口冲突,映射为 9126
volumes:
– /:/rootfs:ro # 只读挂载根目录,采集系统信息
– /var/run:/var/run:ro
– /sys:/sys:ro
– /var/lib/docker/:/var/lib/docker:ro # 读取 Docker 容器元数据
networks:
– prom–net
# Node Exporter 主机指标采集器
node-exporter:
image: prom/node–exporter:v1.6.1
container_name: node–exporter
restart: always
ports:
– "9100:9100"
volumes:
– /proc:/host/proc:ro
– /sys:/host/sys:ro
– /:/rootfs:ro
command:
– '–path.procfs=/host/proc'
– '–path.sysfs=/host/sys'
– '–collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
user: root # 以 root 权限运行,确保能读取系统文件
networks:
– prom–net
# Grafana 可视化面板
grafana:
image: grafana/grafana:10.2.2
container_name: grafana
restart: always
ports:
– "3000:3000"
volumes:
– grafana–data:/var/lib/grafana # 面板配置和数据持久化
environment:
– GF_SECURITY_ADMIN_PASSWORD=Admin@123 # Grafana 管理员密码(建议修改)
– GF_USERS_ALLOW_SIGN_UP=false # 禁止新用户注册
networks:
– prom–net
# 持久化数据卷(避免容器删除后数据丢失)
volumes:
prometheus-data:
grafana-data:
# 自定义网络(隔离监控组件通信)
networks:
prom-net:
driver: bridge
3.2.2 编写 Prometheus 配置文件(prometheus.yml)
在 /opt/prometheus-docker 目录下创建 prometheus.yml:
global:
scrape_interval: 15s # 全局指标采集间隔(15秒一次,可按需调整)
evaluation_interval: 15s # 告警规则评估间隔
storage.tsdb.retention.time: 7d # 监控数据保留 7 天(按需修改,如 30d)
# 告警规则文件路径
rule_files:
– "./alert.rules.yml"
# 指标采集目标配置
scrape_configs:
# 1. 采集 Prometheus 自身指标(监控监控系统本身)
– job_name: 'prometheus'
static_configs:
– targets: ['prometheus:9090'] # 容器名+内部端口(Docker 内部网络通信)
# 2. 采集 Docker 容器指标(核心)
– job_name: 'docker-containers'
static_configs:
– targets: ['cadvisor:8080'] # cAdvisor 容器内部端口
# 3. 采集主机指标(补充容器运行环境监控)
– job_name: 'node'
static_configs:
– targets: ['node-exporter:9100'] # Node Exporter 容器内部端口
# 告警配置(对接 Alertmanager 时启用,基础场景可省略)
alerting:
alertmanagers:
– static_configs:
– targets:
# – 'alertmanager:9093' # 若部署 Alertmanager,添加此地址
3.2.3 编写告警规则文件(alert.rules.yml)
在 /opt/prometheus-docker 目录下创建 alert.rules.yml,配置核心告警规则:
groups:
– name: 容器监控告警组
rules:
# 1. 容器 CPU 使用率超过 80%(持续 1 分钟)
– alert: 容器CPU使用率过高
expr: sum(rate(container_cpu_usage_seconds_total{name!=""}[1m])) by (name) / sum(container_spec_cpu_quota{name!=""}/1e9) by (name) > 0.8
for: 1m
labels:
severity: warning # 告警级别(warning/critical)
annotations:
summary: "容器 {{ $labels.name }} CPU 使用率过高"
description: "容器 {{ $labels.name }} CPU 使用率已超过 80%,当前值:{{ $value | humanizePercentage }}"
# 2. 容器内存使用率超过 85%(持续 1 分钟)
– alert: 容器内存使用率过高
expr: (container_memory_usage_bytes{name!=""} – container_memory_cache{name!=""}) / container_spec_memory_limit_bytes{name!=""} > 0.85
for: 1m
labels:
severity: warning
annotations:
summary: "容器 {{ $labels.name }} 内存使用率过高"
description: "容器 {{ $labels.name }} 内存使用率已超过 85%,当前值:{{ $value | humanizePercentage }}"
# 3. 容器磁盘写速率过高(超过 10MB/s,持续 2 分钟)
– alert: 容器磁盘写速率过高
expr: rate(container_fs_writes_bytes_total{name!=""}[2m]) > 10485760
for: 2m
labels:
severity: warning
annotations:
summary: "容器 {{ $labels.name }} 磁盘写速率过高"
description: "容器 {{ $labels.name }} 磁盘写速率超过 10MB/s,当前值:{{ $value | humanizeBytes }}/s"
– name: 主机监控告警组
rules:
# 1. 主机 CPU 使用率超过 85%(持续 1 分钟)
– alert: 主机CPU使用率过高
expr: 100 – (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 85
for: 1m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} CPU 使用率过高"
description: "主机 {{ $labels.instance }} CPU 使用率已超过 85%,当前值:{{ $value | humanizePercentage }}"
# 2. 主机磁盘可用空间不足 20%
– alert: 主机磁盘空间不足
expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.2
for: 5m
labels:
severity: critical
annotations:
summary: "主机 {{ $labels.instance }} 磁盘空间不足"
description: "主机 {{ $labels.instance }} 根目录可用空间不足 20%,当前可用:{{ $value | humanizePercentage }}"
# 3. 主机 Swap 使用率超过 90%
– alert: 主机Swap使用率过高
expr: (node_swap_used_bytes / node_swap_total_bytes) > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} Swap 使用率过高"
description: "主机 {{ $labels.instance }} Swap 使用率已超过 90%,当前值:{{ $value | humanizePercentage }}"
3.3 启动服务
# 后台启动所有组件(-d 表示 detached 模式)
docker compose up -d
# 查看启动状态(确保所有容器状态为 Up)
docker compose ps
正常输出示例:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
cadvisor gcr.io/cadvisor/cadvisor:v0.47.0 "/usr/bin/cadvisor -…" cadvisor 5s ago Up 4s 0.0.0.0:9126->8080/tcp
grafana grafana/grafana:10.2.2 "/run.sh" grafana 5s ago Up 4s 0.0.0.0:3000->3000/tcp
node-exporter prom/node-exporter:v1.6.1 "/bin/node_exporter –…" node-exporter 5s ago Up 4s 0.0.0.0:9100->9100/tcp
prometheus prom/prometheus:v2.45.0 "/bin/prometheus –co…" prometheus 5s ago Up 4s 0.0.0.0:9090->9090/tcp
四、配置 Grafana 可视化面板
4.1 登录 Grafana
- 用户名:admin
- 密码:Admin@123(docker-compose.yml 中配置的密码)

4.2 添加 Prometheus 数据源
登录后,点击左侧 Configuration(齿轮图标)→ Data Sources → Add data source


搜索并选择 Prometheus

配置数据源:
- URL:(Docker 内部网络,直接通过容器名访问)
- 其他参数保持默认

点击 Save & test,显示“Data source is working”即配置成功

4.3 导入 Docker 监控面板
Grafana 提供现成的 Docker 监控模板,无需自定义:
点击左侧 Dashboards → Import


在 Import via grafana.com 输入模板 ID:893(Docker 容器监控经典模板,支持 cAdvisor 数据),点击 Load

在导入页面:
- 选择数据源:下拉选择之前添加的 Prometheus
- 面板名称:可自定义(如“Docker 容器监控面板”)
点击 Import,完成面板导入

备选模板(按需选择)
- 模板 ID 193:更详细的 Docker 容器监控(支持容器进程、健康状态)
- 模板 ID 405:主机+容器一体化监控面板(适合同时关注主机和容器)
- 模板 ID 12294:Docker 集群监控面板(适合多主机 Docker 环境)
4.4 面板使用说明
- 筛选功能:面板支持按容器名、主机名筛选特定容器的监控数据
- 时间范围:可调整时间范围(如最近 1 小时、最近 24 小时)查看历史趋势
- 指标展示:包含容器 CPU/内存/网络吞吐量/磁盘 IO、主机资源使用率等核心指标

五、验证监控效果
5.1 验证 Prometheus 指标采集
- 容器 CPU 指标:container_cpu_usage_seconds_total
- 容器内存指标:container_memory_usage_bytes
- 主机磁盘指标:node_filesystem_avail_bytes
- 主机 Swap 指标:node_swap_used_bytes

5.2 验证告警规则
访问 Prometheus 告警页面:http://服务器IP:9090/alerts
查看所有告警规则状态:正常状态为 Inactive,触发告警时为 Pending 或 Firing

模拟告警测试(可选):
# 启动一个高负载容器,触发 CPU 使用率告警
docker run -it –rm stress –cpu 4
观察告警页面,约 1 分钟后告警状态变为 Firing,说明告警规则生效
六、日常维护操作
6.1 查看日志
# 查看 Prometheus 日志(排查指标采集问题)
docker compose logs -f prometheus
# 查看 cAdvisor 日志(排查容器指标采集问题)
docker compose logs -f cadvisor
# 查看 Grafana 日志(排查面板展示问题)
docker compose logs -f grafana
6.2 重启服务
# 重启所有组件
docker compose restart
# 重启单个组件(如 Prometheus)
docker compose restart prometheus
6.3 升级组件版本
docker compose up -d # 重启服务应用新版本
6.4 数据清理
- Prometheus 数据:通过 prometheus.yml 中的 storage.tsdb.retention.time 配置数据保留时间(如 7d 表示保留 7 天)
- Grafana 数据:若需清理历史面板或配置,可删除 grafana-data 卷(谨慎操作,会丢失所有自定义配置)
6.5 停止服务
# 停止所有组件(数据不会丢失)
docker compose down
# 停止并删除数据卷(谨慎操作,会丢失所有监控数据和配置)
docker compose down -v
七、常见问题排查
7.1 Grafana 无法连接 Prometheus
- 问题现象:Grafana 提示“Data source is not working”
- 排查步骤:
- 检查 Prometheus 容器是否正常运行:docker compose ps prometheus
- 确认 Grafana 数据源 URL 正确(必须是 http://prometheus:9090,而非 http://服务器IP:9090)
(这里的prometheus是你docker-compose里指定的的容器名称) - 进入 Grafana 容器测试网络连通性:docker exec -it grafana ping prometheus
7.2 容器指标无数据(Grafana 面板显示 N/A)
- 问题现象:容器 CPU/内存指标显示无数据,主机指标正常
- 排查步骤:
- 检查 cAdvisor 容器日志:docker compose logs -f cadvisor
- 确认 /var/lib/docker 挂载正确:docker exec -it cadvisor ls /var/lib/docker
- CentOS 系统需关闭 SELinux:setenforce 0(临时关闭)或修改 SELinux 策略
7.3 主机磁盘/Swap/Load 无数据
- 问题现象:主机相关指标显示 N/A,容器指标正常
- 排查步骤:
- 确认 Node Exporter 以 root 权限运行(docker-compose.yml 中已配置 user: root)
- 检查 Node Exporter 指标:curl http://服务器IP:9100/metrics | grep -E 'node_filesystem|node_swap|node_load'
- 若无输出,重启 Node Exporter:docker compose restart node-exporter
7.4 告警规则不触发
- 问题现象:指标已超过阈值,但告警状态仍为 Inactive
- 排查步骤:
- 检查 Prometheus 告警页面:http://服务器IP:9090/alerts,确认规则是否启用
- 验证告警表达式:在 Prometheus 查询框输入告警 expr,确认是否返回结果
- 检查 for 字段配置(如 for: 1m 表示需持续 1 分钟才触发)
八、附录
附录 A:Docker 和 Docker Compose 安装教程(Ubuntu 20.04)
# 1. 安装依赖
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
# 2. 添加 Docker 软件源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3. 安装 Docker
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 4. 启动 Docker 并设置开机自启
sudo systemctl start docker && sudo systemctl enable docker
# 5. 安装 Docker Compose
sudo curl -SL https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)–$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 6. 验证安装
docker –version
docker compose version
附录 B:核心组件官方文档
- Prometheus 官方文档:https://prometheus.io/docs/
- cAdvisor 官方文档:https://github.com/google/cadvisor
- Grafana 官方文档:https://grafana.com/docs/
- Docker Compose 官方文档:https://docs.docker.com/compose/
附录 C:常用 PromQL 查询语句
| 容器 CPU 使用率(Top5) | sort_desc(sum(rate(container_cpu_usage_seconds_total{name!=“”}[1m])) by (name))[5:] |
| 容器内存使用率 | (container_memory_usage_bytes{name!=“”} – container_memory_cache{name!=“”}) / container_spec_memory_limit_bytes{name!=“”} |
| 容器网络入流量 | rate(container_network_receive_bytes_total{name!=“”}[1m]) |
| 容器网络出流量 | rate(container_network_transmit_bytes_total{name!=“”}[1m]) |
| 主机 CPU 使用率 | 100 – (avg by (instance) (irate(node_cpu_seconds_total{mode=“idle”}[1m])) * 100) |
| 主机磁盘可用空间 | node_filesystem_avail_bytes{mountpoint=“/”} / node_filesystem_size_bytes{mountpoint=“/”} |
| {name!=“”}) / container_spec_memory_limit_bytes{name!=“”} | |
| 容器网络入流量 | rate(container_network_receive_bytes_total{name!=“”}[1m]) |
| 容器网络出流量 | rate(container_network_transmit_bytes_total{name!=“”}[1m]) |
| 主机 CPU 使用率 | 100 – (avg by (instance) (irate(node_cpu_seconds_total{mode=“idle”}[1m])) * 100) |
| 主机磁盘可用空间 | node_filesystem_avail_bytes{mountpoint=“/”} / node_filesystem_size_bytes{mountpoint=“/”} |



