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

  1. 浏览器访问:http://服务器IP:3000
  2. 登录信息:
    • 用户名:admin
    • 密码:Admin@123(docker-compose.yml 中配置的密码)
  3. 首次登录后,建议修改管理员密码(右上角 → 头像→ Change Password)
    在这里插入图片描述

4.2 添加 Prometheus 数据源

  1. 登录后,点击左侧 Configuration(齿轮图标)→ Data Sources → Add data source
    在这里插入图片描述

    在这里插入图片描述

  2. 搜索并选择 Prometheus
    在这里插入图片描述

  3. 配置数据源:

    • URL: (Docker 内部网络,直接通过容器名访问)
    • 其他参数保持默认
      在这里插入图片描述
  4. 点击 Save & test,显示“Data source is working”即配置成功
    在这里插入图片描述

4.3 导入 Docker 监控面板

Grafana 提供现成的 Docker 监控模板,无需自定义:

  1. 点击左侧 Dashboards → Import
    在这里插入图片描述

    在这里插入图片描述

  2. Import via grafana.com 输入模板 ID:893(Docker 容器监控经典模板,支持 cAdvisor 数据),点击 Load
    在这里插入图片描述

  3. 在导入页面:

    • 选择数据源:下拉选择之前添加的 Prometheus
    • 面板名称:可自定义(如“Docker 容器监控面板”)
  4. 点击 Import,完成面板导入
    在这里插入图片描述

备选模板(按需选择)
  • 模板 ID 193:更详细的 Docker 容器监控(支持容器进程、健康状态)
  • 模板 ID 405:主机+容器一体化监控面板(适合同时关注主机和容器)
  • 模板 ID 12294:Docker 集群监控面板(适合多主机 Docker 环境)

4.4 面板使用说明

  • 筛选功能:面板支持按容器名、主机名筛选特定容器的监控数据
  • 时间范围:可调整时间范围(如最近 1 小时、最近 24 小时)查看历史趋势
  • 指标展示:包含容器 CPU/内存/网络吞吐量/磁盘 IO、主机资源使用率等核心指标
    在这里插入图片描述

五、验证监控效果

5.1 验证 Prometheus 指标采集

  1. 访问 Prometheus 页面:http://服务器IP:9090
  2. 在查询框输入以下指标,点击 Execute,若显示数据则采集正常:
    • 容器 CPU 指标:container_cpu_usage_seconds_total
    • 容器内存指标:container_memory_usage_bytes
    • 主机磁盘指标:node_filesystem_avail_bytes
    • 主机 Swap 指标:node_swap_used_bytes
      在这里插入图片描述

5.2 验证告警规则

  1. 访问 Prometheus 告警页面:http://服务器IP:9090/alerts

  2. 查看所有告警规则状态:正常状态为 Inactive,触发告警时为 PendingFiring
    在这里插入图片描述

  3. 模拟告警测试(可选):

    # 启动一个高负载容器,触发 CPU 使用率告警
    docker run -it --rm stress --cpu 4
    
  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 升级组件版本

  1. 修改 docker-compose.yml 中对应组件的 image 版本(如 Prometheus 升级到 v2.46.0)
  2. 执行以下命令:
    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”
  • 排查步骤:
    1. 检查 Prometheus 容器是否正常运行:docker compose ps prometheus
    2. 确认 Grafana 数据源 URL 正确(必须是 http://prometheus:9090,而非 http://服务器IP:9090
      (这里的prometheus是你docker-compose里指定的的容器名称)
    3. 进入 Grafana 容器测试网络连通性:docker exec -it grafana ping prometheus

7.2 容器指标无数据(Grafana 面板显示 N/A)

  • 问题现象:容器 CPU/内存指标显示无数据,主机指标正常
  • 排查步骤:
    1. 检查 cAdvisor 容器日志:docker compose logs -f cadvisor
    2. 确认 /var/lib/docker 挂载正确:docker exec -it cadvisor ls /var/lib/docker
    3. CentOS 系统需关闭 SELinux:setenforce 0(临时关闭)或修改 SELinux 策略

7.3 主机磁盘/Swap/Load 无数据

  • 问题现象:主机相关指标显示 N/A,容器指标正常
  • 排查步骤:
    1. 确认 Node Exporter 以 root 权限运行(docker-compose.yml 中已配置 user: root
    2. 检查 Node Exporter 指标:curl http://服务器IP:9100/metrics | grep -E 'node_filesystem|node_swap|node_load'
    3. 若无输出,重启 Node Exporter:docker compose restart node-exporter

7.4 告警规则不触发

  • 问题现象:指标已超过阈值,但告警状态仍为 Inactive
  • 排查步骤:
    1. 检查 Prometheus 告警页面:http://服务器IP:9090/alerts,确认规则是否启用
    2. 验证告警表达式:在 Prometheus 查询框输入告警 expr,确认是否返回结果
    3. 检查 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=“/”}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐