欢迎光临
我们一直在努力

Prometheus + Grafana 监控 Docker 容器部署文档

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 # 配置文件挂载
prometheusdata:/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:
promnet # 自定义网络,组件间通信

# 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:
promnet

# Node Exporter 主机指标采集器
node-exporter:
image: prom/nodeexporter:v1.6.1
container_name: nodeexporter
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:
promnet

# Grafana 可视化面板
grafana:
image: grafana/grafana:10.2.2
container_name: grafana
restart: always
ports:
"3000:3000"
volumes:
grafanadata:/var/lib/grafana # 面板配置和数据持久化
environment:
GF_SECURITY_ADMIN_PASSWORD=Admin@123 # Grafana 管理员密码(建议修改)
GF_USERS_ALLOW_SIGN_UP=false # 禁止新用户注册
networks:
promnet

# 持久化数据卷(避免容器删除后数据丢失)
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
      在这里插入图片描述
  • 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

    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 查询语句

    指标需求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=“/”}
    赞(0)
    未经允许不得转载:171主机测评 » Prometheus + Grafana 监控 Docker 容器部署文档
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址