1. 项目概述
最近在帮客户部署一套基于Docker容器的监控系统,选择了夜莺监控(Nightingale,简称n9e)作为监控平台,搭配Categraf作为数据采集器。这套组合在实际生产环境中表现相当稳定,今天就把完整的配置过程整理出来,尤其针对Docker监控这个专项场景。
先说说为什么选这个方案:n9e作为国产开源监控系统,相比Prometheus+Grafana的组合更轻量,内置了告警规则管理和事件中心,特别适合中小规模场景。而Categraf作为All-in-One的采集器,一个进程就能搞定指标、日志、事件等多种数据采集,资源占用只有Telegraf的1/3左右。
2. 环境准备
2.1 组件版本选择
当前稳定版本组合:
- n9e v5.8.1(前端+后端)
- Categraf v0.2.38
- Docker 20.10.17
建议在测试环境先用相同版本验证,避免兼容性问题。我遇到过Categraf 0.3.0的alpha版采集Docker指标时会出现标签丢失的情况,所以生产环境还是建议用稳定版。
2.2 基础环境配置
所有节点需要预先配置:
# 设置系统参数 echo "vm.max_map_count=262144" >> /etc/sysctl.conf sysctl -p # 创建专用数据目录 mkdir -p /data/n9e/{data,logs} chmod 777 /data/n9e/logs重要提示:如果监控的Docker主机超过50台,建议将n9e的时序数据库(TSDB)单独部署,默认内置的TSDB适合小规模场景。
3. n9e服务部署
3.1 使用Docker-Compose部署
准备docker-compose.yml文件:
version: '3' services: n9e: image: flashcatcloud/n9e:v5.8.1 container_name: n9e ports: - "18000:18000" volumes: - /data/n9e/data:/home/n9e/data - /data/n9e/logs:/home/n9e/logs environment: - TZ=Asia/Shanghai restart: always启动命令:
docker-compose up -d3.2 初始配置
访问
http://<服务器IP>:18000初始账号/密码:root/root.2020进入【系统配置】→【数据源】添加默认的时序数据库:
- 名称:default
- 类型:prometheus
- 地址:http://localhost:9090(使用内置TSDB)
配置SMTP告警(可选但建议):
SMTP服务器:smtp.xxx.com 端口:465 发件人:monitor@yourdomain.com 认证账号:monitor@yourdomain.com 密码:******
4. Categraf配置详解
4.1 Docker部署Categraf
准备配置文件目录结构:
mkdir -p /etc/categraf/{conf,logs}docker-compose配置示例:
categraf: image: flashcatcloud/categraf:v0.2.38 container_name: categraf volumes: - /etc/categraf/conf:/etc/categraf/conf - /etc/categraf/logs:/var/log/categraf - /var/run/docker.sock:/var/run/docker.sock restart: always4.2 核心配置文件
- 主配置文件
config.toml:
[global] hostname = "docker-node-01" # 必须唯一 interval = 15 # 采集间隔(秒) [writer_opt] batch = 2000 # 每次上报数据批大小 conn_timeout = 5000 # 毫秒 writers = ["http://n9e-server:18000/prometheus/v1/write"] [heartbeat] enable = true url = "http://n9e-server:18000/v1/n9e/heartbeat" interval = 10 # 心跳间隔(秒)- Docker监控配置
conf/input.docker/docker.toml:
[[instances]] endpoint = "unix:///var/run/docker.sock" # 监控的容器标签(可选) container_label_include = ["com.docker.*", "io.kubernetes.*"] # 采集的指标过滤 metric_filter = [ "container_cpu_*", "container_memory_*", "container_network_*", "container_fs_*" ] # 额外标签 extra_tags = { "region" = "shanghai", "env" = "prod" }4.3 高级配置技巧
- 针对特定容器单独配置:
[[instances.containers]] names = ["nginx", "mysql"] extra_tags = { "service_type" = "critical" } [[instances.containers]] names = ["redis*"] metric_filter = ["container_memory_*"]- 排除系统容器:
container_exclude = [ "name=^/k8s_.*", "name=^/ecs_.*" ]5. 监控指标解析
5.1 核心监控指标
Categraf采集的Docker指标主要分为几类:
CPU相关:
container_cpu_usage_seconds_total:容器CPU使用时间(秒)container_cpu_system_seconds_total:系统CPU时间container_cpu_user_seconds_total:用户CPU时间
内存相关:
container_memory_usage_bytes:内存使用量container_memory_rss:常驻内存集container_memory_swap:交换内存使用量
网络相关:
container_network_receive_bytes_total:接收字节数container_network_transmit_bytes_total:发送字节数
5.2 关键指标计算公式
CPU使用率:
sum(rate(container_cpu_usage_seconds_total[1m])) by (container_name) / container_spec_cpu_quota * 100内存使用率:
container_memory_usage_bytes / container_spec_memory_limit_bytes * 100网络吞吐量(字节/秒):
rate(container_network_receive_bytes_total[1m]) rate(container_network_transmit_bytes_total[1m])
6. 告警规则配置
6.1 常用Docker告警规则
在n9e的【告警规则】页面创建:
CPU过载告警:
{ "name": "Docker容器CPU过载", "query": "sum(rate(container_cpu_usage_seconds_total{container_name!=\"\"}[1m])) by (container_name) / on(container_name) container_spec_cpu_quota * 100 > 90", "duration": "3m", "severity": "critical" }内存泄漏检测:
{ "name": "Docker容器内存持续增长", "query": "predict_linear(container_memory_usage_bytes{container_name!=\"\"}[1h], 3600) / container_spec_memory_limit_bytes * 100 > 120", "duration": "30m", "severity": "warning" }
6.2 告警模板优化建议
在告警信息中加入容器标签:
容器 {{$labels.container_name}} ({{$labels.image}}) 在 {{$labels.host}} 上 {{$value}}% CPU使用率超过阈值为不同环境设置不同阈值:
{{ if eq $labels.env "prod" }} 阈值: 85% {{ else }} 阈值: 95% {{ end }}
7. 常见问题排查
7.1 数据采集问题
现象:n9e上看不到Docker指标
- 检查Categraf日志:
docker logs categraf | grep -i docker - 验证Docker socket权限:
ls -l /var/run/docker.sock
- 检查Categraf日志:
现象:部分容器指标缺失
- 检查容器是否有
--read-only参数 - 确认容器没有处于
paused状态
- 检查容器是否有
7.2 性能优化建议
大规模环境调整参数:
[global] interval = 30 # 调大采集间隔 precision = 1000 # 降低数据精度 [writer_opt] batch = 5000 # 增大批处理量 workers = 8 # 增加写入并发数使用黑名单过滤不必要指标:
metric_filter = [ "!container_blkio_*", "!container_fs_inodes_*" ]
8. 监控面板配置
8.1 内置Docker仪表盘
n9e已经内置了Docker监控面板,位置在: 【仪表盘】→【内置仪表盘】→【Docker】
包含以下关键视图:
- 容器列表(运行状态、资源占用排名)
- 单容器详情(CPU/Memory/Network历史趋势)
- 主机维度汇总(容器数量、资源总量)
8.2 自定义面板技巧
添加容器启动时间统计:
time() - container_start_time_seconds可视化配置为「状态列表」类型,设置颜色阈值:
- <1h:绿色
- 1-24h:蓝色
24h:黄色
制作容器重启告警面板:
changes(container_start_time_seconds[1h])配合「智能图表」的阈值标记功能,突出显示异常节点
9. 生产环境经验
9.1 部署架构建议
对于超过100节点的环境,推荐采用这种架构:
[ Categraf Agent ] -> [ N9e Server ] -> [ 独立TSDB集群 ] / \ [ MySQL ] [ Redis ]关键配置调整:
n9e增加缓存层:
[redis] address = "redis-server:6379" db = 1使用远程MySQL:
[mysql] host = "mysql-server" port = 3306 user = "n9e" password = "yourpassword"
9.2 安全加固措施
Categraf通信加密:
[writer_opt] basic_auth_user = "categraf" basic_auth_pass = "securepassword"n9e API访问控制:
# 在nginx反向代理后添加 location /api/ { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; }Docker socket代理方案:
socat UNIX-LISTEN:/proxy/docker.sock,fork \ UNIX-CONNECT:/var/run/docker.sock &然后让Categraf连接代理socket
这套配置方案已经在多个客户生产环境稳定运行半年以上,单个n9e实例能轻松处理500+ Docker节点的监控数据。最关键的是要合理设置采集频率和指标过滤,避免产生过多非必要数据。