1. 项目概述最近在帮客户部署一套基于Docker容器的监控系统选择了夜莺监控Nightingale简称n9e作为监控平台搭配Categraf作为数据采集器。这套组合在实际生产环境中表现相当稳定今天就把完整的配置过程整理出来尤其针对Docker监控这个专项场景。先说说为什么选这个方案n9e作为国产开源监控系统相比PrometheusGrafana的组合更轻量内置了告警规则管理和事件中心特别适合中小规模场景。而Categraf作为All-in-One的采集器一个进程就能搞定指标、日志、事件等多种数据采集资源占用只有Telegraf的1/3左右。2. 环境准备2.1 组件版本选择当前稳定版本组合n9e v5.8.1前端后端Categraf v0.2.38Docker 20.10.17建议在测试环境先用相同版本验证避免兼容性问题。我遇到过Categraf 0.3.0的alpha版采集Docker指标时会出现标签丢失的情况所以生产环境还是建议用稳定版。2.2 基础环境配置所有节点需要预先配置# 设置系统参数 echo vm.max_map_count262144 /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: - TZAsia/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 发件人monitoryourdomain.com 认证账号monitoryourdomain.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现象部分容器指标缺失检查容器是否有--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 yourpassword9.2 安全加固措施Categraf通信加密[writer_opt] basic_auth_user categraf basic_auth_pass securepasswordn9e 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节点的监控数据。最关键的是要合理设置采集频率和指标过滤避免产生过多非必要数据。