原创

Docker Compose 一键搭建服务器全方位监控

温馨提示:
本文最后更新于 2026年03月04日,已超过 22 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

 

在运维工作中,我们常面临这样的灵魂拷问:

  • “服务器 CPU 是不是爆了?”
  • “我的 Web 服务端口通不通?”
  • “API 接口响应是不是变慢了?”
  • “宕机了我能第一时间收到电话吗?”

单靠一个工具往往难以兼顾所有场景。Node Exporter 擅长系统底层,Uptime Kuma 擅长服务探活,而 Grafana 则是统一可视化与告警的大脑。本文将手把手教你在 Ubuntu 上通过 Docker Compose 一键部署这套黄金组合,构建无死角的监控体系。

一、环境规划与准备

为了保持系统整洁,我们将所有配置文件和数据持久化在 /opt/monitoring 目录下。

1. 创建目录结构

sudo mkdir -p /opt/monitoring/{prometheus,grafana,uptime-kuma}
cd /opt/monitoring

2. 编写 Prometheus 配置文件

Prometheus 是数据核心。由于它运行在容器中,我们需要特殊配置才能让它“看见”宿主机的指标。

创建文件 prometheus/prometheus.yml

global:
  scrape_interval: 15s # 采集频率:每 15 秒一次

scrape_configs:
  # 1. 监控 Prometheus 自身健康状态
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 2. 监控 Ubuntu 宿主机 (通过 Node Exporter)
  - job_name: 'node-exporter'
    static_configs:
      # 关键点:使用 host.docker.internal 指向宿主机 IP
      - targets: ['host.docker.internal:9100']

3. 编写 Docker Compose 编排文件

这是整个架构的蓝图。我们定义了四个核心组件,并预置了邮件通知配置。

创建文件 docker-compose.yml

version: '3.8'

services:
  # --- 1. Node Exporter (操作系统数据采集) ---
  # 采集 CPU、内存、磁盘、网络等底层指标
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    network_mode: host # 关键:使用宿主机网络,直接暴露 9100
    pid: host
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'

  # --- 2. Prometheus (数据存储与计算引擎) ---
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=15d' # 数据保留 15 天
    # 【关键】让容器能解析 host.docker.internal 为宿主机网关 IP
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - monitoring-net

  # --- 3. Grafana (可视化大屏 & 智能告警) ---
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin123
      - GF_USERS_ALLOW_SIGN_UP=false
      # SMTP 邮件通知配置 (以 QQ 邮箱为例)
      - GF_SMTP_ENABLED=true
      - GF_SMTP_HOST=smtp.qq.com:587
      - GF_SMTP_USER=你的QQ号@qq.com
      - GF_SMTP_PASSWORD=你的邮箱授权码
      - GF_SMTP_FROM_ADDRESS=你的QQ号@qq.com
      # 国内邮箱建议开启,跳过证书验证
      - GF_SMTP_SKIP_VERIFY=true          
    depends_on:
      - prometheus
    networks:
      - monitoring-net

  # --- 4. Uptime Kuma (TCP/HTTP 服务探活) ---
  # 轻量级监控,适合检测端口通断、HTTP 状态码、SSL 证书过期等
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma:/app/data
      # 关键:挂载 Docker Socket,让 Kuma 能监控容器
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - monitoring-net

volumes:
  prometheus_data:
  grafana_data:

networks:
  monitoring-net:
    driver: bridge

二、一键启动服务

一切就绪,启动我们的监控舰队!

cd /opt/monitoring

# 后台启动所有容器
sudo docker-compose up -d

# 检查状态,确保 STATUS 均为 Up
sudo docker ps

看到 node-exporter, prometheus, grafana, uptime-kuma 都在运行,即表示部署成功。

三、操作系统监控

这部分主要监控 CPU、内存、磁盘、网络 等底层资源。

1. 登录与数据源配置

  1. 浏览器访问 http://<服务器IP>:3000,账号 admin,密码 admin123
  2. 进入 Connections -> Data Sources -> Add data source -> Prometheus
  3. URL 填写:http://prometheus:9090 (Docker 内部通信)。
  4. 点击 Save & test,看到绿色提示即成功。

2. 导入经典仪表盘

无需从零画图,社区有现成的精美模板。

  1. 进入 Dashboards -> New -> Import
  2. 输入 ID:1860 (Node Exporter Full,最经典的系统监控模板)。
  3. 选择刚才创建的 Prometheus 数据源,点击 Import
  4. 效果:你将立刻看到实时的 CPU 核负载、内存使用趋势、磁盘 I/O 读写、网络流量图等。

3. 配置智能告警

单纯的看图表不够,我们需要主动报警,以 CPU > 80% 为例。

  1. 创建规则:进入 Alerting -> Alert rules -> New alert rule
  2. 命名CPU 使用率过高 (>80%)
  3. 定义查询 (PromQL)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

原理:100 减去空闲率。[5m] 取 5 分钟平均,过滤瞬间毛刺。

  1. 设置条件WHEN QUERY A IS ABOVE 80
  2. 评估行为 (防误报关键)
    • Evaluation interval: 1m (每分钟检查一次)。
    • Pending period: 5m (强烈建议)。只有持续 5 分钟超标才报警,避免重启或编译时的短暂高峰骚扰你。
  1. 通知详情
    • Summary: 实例 {{ $labels.instance }} CPU 告警
    • Description: 当前使用率 {{ $values.A.Value }}%
  1. 保存:选择对应的 Contact Point (需在 Alerting 菜单预先配置邮件),然后保存。

四、服务可用性监控

Grafana 擅长看“内部指标”,而 Uptime Kuma 擅长模拟用户视角,检测 TCP 端口HTTP 服务 是否对外可用。

1. 初始化

访问 http://<服务器IP>:3001,创建管理员账号。

2. 配置通知渠道

  1. 点击右上角头像 -> Settings -> Notification Settings -> Setup Notification
  2. 选择 SMTP。
  3. 填写邮箱信息并 Test,确保能收到测试邮件。

3. 添加监控任务

Uptime Kuma 支持多种监控类型,完美覆盖 TCP 和 HTTP:

场景 A:监控 HTTP 网站/API

  • Type: HTTP(s)
  • Name: My Website Status
  • URL: https://www.example.com
  • Interval: 60 seconds
  • Notification: 勾选刚才配置的邮件。
  • 作用:检测网站是否返回 200 OK,响应时间是否过长。

场景 B:监控 TCP 端口

  • Type: TCP Port
  • Name: MySQL Database
  • Hostname: 192.168.1.50 (或域名)
  • Port: 3306
  • 作用:检测数据库端口是否通,防火墙是否拦截,服务是否挂掉。

场景 C:监控 Ping 延迟

  • Type: Ping
  • Hostname: 8.8.8.8
  • 作用:检测网络链路是否通畅。

五、总结:双剑合璧

通过这套方案,你构建了立体的监控防御体系:

监控维度

工具

优势

典型场景

操作系统底层

Prometheus + Grafana

指标丰富、历史回溯、复杂计算

CPU 飙高、内存泄漏、磁盘写满、网络拥塞

服务对外可用性

Uptime Kuma

配置简单、界面美观、多协议支持

网站打不开、数据库连不上、SSL 证书过期

告警通知

双通道

互补覆盖

资源预警走 Grafana,服务宕机走 Uptime Kuma

现在,你可以安心地去喝杯咖啡了,因为无论系统底层还是上层服务,一旦异常,警报即刻送达!

正文到此结束