Prometheus + Grafana 监控 Docker 容器部署文档
本文档详细介绍了基于Prometheus和Grafana的Docker容器监控系统部署方案。采用Docker Compose容器化部署,包含四个核心组件:Prometheus负责指标采集存储、cAdvisor采集容器指标、Node Exporter采集主机指标、Grafana实现数据可视化。文档提供了完整的部署步骤,包括环境准备、配置文件编写(docker-compose.yml、promethe
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
- 浏览器访问:
http://服务器IP:3000 - 登录信息:
- 用户名:
admin - 密码:
Admin@123(docker-compose.yml 中配置的密码)
- 用户名:
- 首次登录后,建议修改管理员密码(右上角 → 头像→ Change Password)

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 指标采集
- 访问 Prometheus 页面:
http://服务器IP:9090 - 在查询框输入以下指标,点击 Execute,若显示数据则采集正常:
- 容器 CPU 指标:
container_cpu_usage_seconds_total - 容器内存指标:
container_memory_usage_bytes - 主机磁盘指标:
node_filesystem_avail_bytes - 主机 Swap 指标:
node_swap_used_bytes
- 容器 CPU 指标:
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.yml中对应组件的image版本(如 Prometheus 升级到 v2.46.0) - 执行以下命令:
docker compose pull # 拉取新版本镜像 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
- 检查 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 策略
- 检查 cAdvisor 容器日志:
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
- 确认 Node Exporter 以 root 权限运行(docker-compose.yml 中已配置
7.4 告警规则不触发
- 问题现象:指标已超过阈值,但告警状态仍为
Inactive - 排查步骤:
- 检查 Prometheus 告警页面:
http://服务器IP:9090/alerts,确认规则是否启用 - 验证告警表达式:在 Prometheus 查询框输入告警 expr,确认是否返回结果
- 检查
for字段配置(如for: 1m表示需持续 1 分钟才触发)
- 检查 Prometheus 告警页面:
八、附录
附录 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 查询语句
| 指标需求 | 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=“/”} |
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)