Docker Compose 一键搭建服务器全方位监控
在运维工作中,我们常面临这样的灵魂拷问:
- “服务器 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. 登录与数据源配置
- 浏览器访问
http://<服务器IP>:3000,账号admin,密码admin123。 - 进入 Connections -> Data Sources -> Add data source -> Prometheus。
- URL 填写:
http://prometheus:9090(Docker 内部通信)。 - 点击 Save & test,看到绿色提示即成功。
2. 导入经典仪表盘
无需从零画图,社区有现成的精美模板。
- 进入 Dashboards -> New -> Import。
- 输入 ID:
1860(Node Exporter Full,最经典的系统监控模板)。 - 选择刚才创建的 Prometheus 数据源,点击 Import。
- 效果:你将立刻看到实时的 CPU 核负载、内存使用趋势、磁盘 I/O 读写、网络流量图等。
3. 配置智能告警
单纯的看图表不够,我们需要主动报警,以 CPU > 80% 为例。
- 创建规则:进入 Alerting -> Alert rules -> New alert rule。
- 命名:
CPU 使用率过高 (>80%)。 - 定义查询 (PromQL):
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
原理:100 减去空闲率。[5m] 取 5 分钟平均,过滤瞬间毛刺。
- 设置条件:
WHEN QUERY A IS ABOVE 80。 - 评估行为 (防误报关键):
- Evaluation interval:
1m(每分钟检查一次)。 - Pending period:
5m(强烈建议)。只有持续 5 分钟超标才报警,避免重启或编译时的短暂高峰骚扰你。
- 通知详情:
- Summary:
实例 {{ $labels.instance }} CPU 告警 - Description:
当前使用率 {{ $values.A.Value }}%
- 保存:选择对应的 Contact Point (需在 Alerting 菜单预先配置邮件),然后保存。
四、服务可用性监控
Grafana 擅长看“内部指标”,而 Uptime Kuma 擅长模拟用户视角,检测 TCP 端口 和 HTTP 服务 是否对外可用。
1. 初始化
访问 http://<服务器IP>:3001,创建管理员账号。
2. 配置通知渠道
- 点击右上角头像 -> Settings -> Notification Settings -> Setup Notification。
- 选择 SMTP。
- 填写邮箱信息并 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 |
现在,你可以安心地去喝杯咖啡了,因为无论系统底层还是上层服务,一旦异常,警报即刻送达!
- 本文标签: 工具
- 本文链接: https://xiaolanzi.cyou/article/73
- 版权声明: 本文由卓原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
