ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Docker部署coolmonitor:轻量级监控平台替代Prometheus的实用指南

2026/9/28 12:12:16 拓冰建站 浏览量
Docker部署coolmonitor:轻量级监控平台替代Prometheus的实用指南 最近给几台服务器补监控第一反应跟大部分人一样直接上Prometheus加Grafana。但真正搭起来才发现这套组合功能没得挑维护成本也是真的高——单是搞清楚指标采集、存储、告警、面板这几层的关系就要花不少时间而且每加一个监控目标还得处理Exporter、重载配置。后来在一次闲聊里被推荐用Docker部署coolmonitor这个轻量级监控平台花了一个下午完成搭建实测下来确实适合解决“我就想看CPU、内存、磁盘、网络出了问题能推个通知”这种朴素诉求。如果你也被大而全的监控方案折腾过这篇文章应该能帮你少走不少弯路。1. 为什么选coolmonitor轻量级监控的定位与适用场景1.1 轻量级监控平台怎么选先说一个很多人没想明白的事监控平台不是越强越好而是越适合越好。如果你只有三五台服务器监控对象是CPU使用率、内存余量、磁盘空间、网络吞吐这类基础指标那Prometheus那套生态确实有点“杀鸡用牛刀”。Prometheus本身不复杂复杂的是围绕它的那一圈组件Exporter、Pushgateway、Alertmanager、Grafana数据源配置、PromQL查询语法每个环节都得有人维护。Zabbix则是另一条路功能全、企业级但部署和配置的复杂度同样在线新手上手容易劝退。coolmonitor的定位就很明确面向小规模基础设施的轻量级监控。它的核心逻辑是“Agent主动上报”——每一台被监控的机器跑一个轻量采集器定时把指标数据推送到服务端服务端负责存储、展示和触发告警。整个架构没有时序数据库没有消息队列服务端单机就能跑Agent占用资源也非常小我以前在只有1核512M内存的小鸡上跑它也没感觉到压力。所以你选型前先问自己三个问题监控对象有多少台需要监控哪些指标谁来长期维护这套系统答案都是“不多、基础、可能就我一个人”的话轻量级方案就是更务实的答案。1.2 coolmonitor的核心构成与监控模型我部署的这套coolmonitor大体上分成三个角色。服务端coolmonitor-server负责接收Agent上报的数据默认用SQLite存历史指标同时根据你配置的告警规则判断要不要发通知。Web端coolmonitor-web是前端仪表盘提供主机列表、状态总览、指标曲线和告警记录界面的交互做得比较符合直觉不用像某些老牌监控那样背一堆术语。Agent则是部署在各台机器上的采集器支持Linux和Windows每隔十几秒采集一次系统指标批量打包后通过HTTP推给服务端。这个“Agent主动上报”的模型值得多说一句。跟Prometheus那种服务端主动拉取不同推模型下的被监控机器不需要对外开放任何入站端口只要它能访问到服务端的地址就行。这在跨机房、混合云、容器网络复杂的环境里特别占便宜不用为了采集数据专门给每台机器做端口放行安全组规则能少写好几条。默认监控的指标主要有六类CPU使用率、系统负载、内存使用率、磁盘空间占用率、网卡上下行速率、进程存活状态探活。如果你需要更细粒度的数据Agent也支持自定义采集脚本但说实话对大多数小规模场景来说这些默认指标已经能覆盖日常90%的排查需求了。1.3 和Prometheus、Zabbix这类老牌方案比优势在哪对比维度Prometheus GrafanaZabbixcoolmonitor部署成本组件多需要编排多个服务依赖数据库和前端配置较重一份compose清单加Agent组件数量采集、存储、告警、面板分离服务端数据库ProxyAgent服务端、Web、Agent存储依赖自带TSDB但长期存储要外接依赖MySQL/PostgreSQLSQLite单文件告警配置需要学PromQL和Alertmanager规则模板较多配置项复杂Web界面里直接写规则适合规模大规模、指标丰富、定制性强中大型企业网络设备小规模服务器基础监控学习成本中高中高低当然这个对比不是要贬低谁。Prometheus在指标维度、生态插件和查询能力上依然是行业标杆你有大规模Kubernetes集群要监控该上还得上。coolmonitor的价值在于当需求复杂度不高时它用最少的组件把核心链路跑通让你把精力留在业务而不是养监控系统本身上。部署完以后你会发现这套东西几乎不需要日常照顾——这在我看来才是“轻量级”三个字真正的意义。2. 部署前准备工作把Docker环境收拾利索2.1 检查Docker与Compose插件版本在动手写编排文件之前先把Docker环境确认好省得后面报一堆莫名其妙的错。我习惯先在服务器上跑两条命令docker version docker compose versionDocker命令能正常输出版本信息说明Docker daemon在运行。docker compose能输出版本说明Compose V2插件已经就位。需要说明的是现在官方推荐的是Compose V2也就是docker compose这个子命令早期那种独立的docker-compose命令虽然也能用但功能更新已经跟不上了新部署建议直接走V2。如果你用的是Windows或macOSDocker Desktop安装过程中最容易翻车的是虚拟化没开启。启动时如果报virtualization support not detected这类错误先去任务管理器里看一下“性能”页签下的虚拟化状态没启用的话要在BIOS里把Intel VT-x或AMD-V打开。还有个常见报错是Docker Desktop启动后一直卡在连接Docker API的步骤提示npipe:////./pipe/dockerDesktopLinux连不上这种情况多半是WSL2内核版本太老执行一次wsl --update再重启基本就能解决。2.2 镜像加速配置与数据目录规划国内网络环境下拉取容器镜像经常超时这是我部署任何容器项目都会先处理的问题。Docker拉镜像走的是镜像仓库默认源在国内访问速度不稳定解决办法是配置镜像加速器。Linux下编辑/etc/docker/daemon.jsonDocker Desktop用户则是在设置面板的Docker Engine里改同样的JSON配置{ registry-mirrors: [ https://你的加速地址 ] }云厂商的容器镜像服务控制台一般都能找到专属加速地址填入后重启Docker让它生效。改完建议先docker pull hello-world测一下拉取速度再继续后面的步骤。数据目录规划容易被忽略但监控平台的数据会一直写入目录理不清后面备份和迁移都难受。我个人习惯在/opt/coolmonitor下建立独立目录结构/opt/coolmonitor/ ├── compose/ │ └── docker-compose.yml └── data/ └── coolmonitor/compose文件放独立的compose目录数据目录单独隔离。这样升级时不会误删数据备份时也只需要打包data目录逻辑非常清楚。2.3 端口与网络规划先想清楚哪些端口要对外暴露避免部署完了被人从公网扫到管理页面。我这次规划的端口如下服务端口用途是否需要公网放开coolmonitor-server9009Agent上报数据和Web调用APIAgent在外网时需要放行按来源IP限制coolmonitor-web8088浏览器访问仪表盘管理需要建议加认证或限制IPcoolmonitor-agent9100Agent本地自检端口无需对外仅供本机调试端口映射不是越多越好原则是“能少放就少放”。如果你只有本机能访问Web页面那映射的时候完全可以写成127.0.0.1:8088:80这样服务只监听在本机回环地址外部根本访问不到比依赖防火墙更稳妥。Agent那边因为是主动上报模型被监控机器只需要能出网访问服务端的9009端口自己不需要开任何入站防火墙端口。3. 编写docker-compose.yml一套编排搞定服务端和前端3.1 服务端和Web端配置逐项拆解直接给我最终用的compose文件基于常见版本细节补充说明services: coolmonitor-server: image: coolmonitor/server:latest container_name: coolmonitor-server restart: unless-stopped environment: - TZAsia/Shanghai - CM_DATA_DIR/data - CM_RETENTION_DAYS30 volumes: - /opt/coolmonitor/data:/data ports: - 9009:9009 healthcheck: test: [CMD, curl, -f, http://localhost:9009/healthz] interval: 30s timeout: 5s retries: 3 coolmonitor-web: image: coolmonitor/web:latest container_name: coolmonitor-web restart: unless-stopped depends_on: coolmonitor-server: condition: service_healthy environment: - TZAsia/Shanghai - CM_API_BASEhttp://coolmonitor-server:9009 ports: - 8088:80几个关键配置说一下都是实战中容易踩坑的地方。restart: unless-stopped是必须的。监控平台最怕的就是机器重启后容器不跟着起来你第二天登录一看所有图表全部断点。这条策略能让容器在Docker服务启动时自动恢复除了手动stop的情况其他时候都会拉起来。TZAsia/Shanghai是很多新手容易漏掉的一项。容器默认时区是UTC如果你不设置监控图表上的时间会跟本地时间整整差8个小时排查问题时对不上时间轴会极其痛苦。所有和日志、告警相关的服务都得显式指定时区。健康检查这段是我自己加的。depends_on如果只写服务名Docker只保证“启动顺序”不保证“服务可用”。Web容器可能在server还没完全就绪时就尝试连接导致前端报API连接失败。配上condition: service_healthy之后Web容器会一直等到server的健康检查通过再启动从根上解决了服务间连接时序问题。3.2 Agent容器化的三种部署姿势Agent的部署方式我总结了三种按场景选择就行。第一种Agent跟服务端在同一台机器上。直接把agent服务写进同一个compose文件里统一管理。这种方式最简单适合监控部署机本身。第二种远程机器用docker run单命令部署。这也是我主力使用的方式docker run -d \ --name coolmonitor-agent \ --restart unless-stopped \ -e CM_AGENT_NAMEweb-01 \ -e CM_SERVER_URLhttp://192.168.1.100:9009 \ -e CM_INTERVAL15s \ -e CM_HOST_IDweb-01 \ coolmonitor/agent:latest环境变量含义很直白CM_AGENT_NAME是这台机器在面板上显示的名字建议直接用主机名CM_SERVER_URL是服务端地址注意要填被监控机器能实际访问到的IP别填localhostCM_INTERVAL是采集间隔默认15秒够用想更实时可以改成5秒但会稍微增加服务端压力。第三种没有Docker的机器用二进制部署。Agent本身是单个可执行文件下载对应平台的二进制包指定同样的环境变量参数启动即可。这种方式适合某些不便引入Docker的存量机器劣势是升级和守护进程管理要自己处理不如容器省心。还有一点如果你想让Agent采集宿主机自身的指标而不是容器内部的部署时建议挂载宿主机的/proc和/sys目录并设置hostname这个做法跟常见的容器内监控宿主机方案一致不然你在面板上看到的CPU和内存数据实际上是容器的不是物理机的。3.3 数据持久化卷、命名与备份监控平台的数据是时间序列丢了就再也补不回来所以持久化是重中之重。compose文件里我把/opt/coolmonitor/data映射到server容器内的/data目录SQLite文件就存在这里。备份我一般这么操作先停server容器保证数据文件一致然后直接打包整个data目录。docker compose stop coolmonitor-server tar czf coolmonitor-backup-$(date %F).tar.gz -C /opt/coolmonitor data docker compose start coolmonitor-server运行中的SQLite数据库直接复制文件可能产生不一致快照所以先把容器停下来是最稳妥的做法。备份频率取决于你多在意数据监控平台一般保留一个月历史就够了我建议每周备份一次文件也不大。升级版本时同样遵循这个流程备份数据、拉新镜像、重新up -d、看日志确认server正常启动。只要数据目录没动过升级基本是无损的。4. 启动、验证与首次配置4.1 启动命令与容器状态确认配置写完后启动流程其实就三条命令docker compose pull docker compose up -d docker compose pspull先把镜像拉到本地避免up -d的时候边拉边启动超时概率高。up -d是后台模式启动所有服务如果这一步报错大概率是端口冲突或镜像拉取失败先把错误信息看清楚再处理。ps看容器状态全部是Up就说明进程层面没有大问题。接着看服务日志这是我判断服务是否“真正可用”的手段docker compose logs -f --tail100 coolmonitor-server正常启动的日志里能看到服务监听地址和数据库初始化完成之类的输出。看到listening on :9009这种关键行服务端就是起来了。Web端可以通过浏览器访问http://服务器IP:8088能出现初始化向导页面就说明Web容器和API的连通性没问题。顺手再用命令行验证一下服务端APIcurl http://localhost:9009/healthz返回表示健康的JSON内容就说明API活着。这一步很快但能帮你在打开浏览器之前就定位问题在哪一段。4.2 Web端首次初始化与纳管主机首次打开Web页面会有一个初始化步骤创建管理员账号。这里设置的密码一定要记牢监控平台的后台密码忘了比业务系统密码忘了还闹心因为找回流程通常很麻烦。初始化之后页面会让你配置服务端API地址。因为我用的是compose部署Web容器内部访问server直接填http://coolmonitor-server:9009就行。如果你的Web和server不在同一个Docker网络里这里就要填实际的IP地址了。纳管主机的操作路径是“添加主机”→填主机名→获取Agent的注册命令。面板上会生成对应的部署命令跟我在3.2节写的那条docker run高度相似。Agent启动后页面上的主机状态会从灰色变为绿色这个过程通常在半分钟内完成。指标图表刚打开时可能有一段空白这是正常的。采集频率15秒图表默认展示的是聚合后的数据点等两三分钟再看就是连续曲线了。如果你过五分钟还是完全空白别急着怀疑图表渲染先按第5章的排查思路检查Agent上报链路。4.3 告警通知配置与数据保留策略监控平台没有告警等于白装没人会一直盯着仪表盘看。coolmonitor的告警通道支持邮件SMTP和通用Webhook。SMTP适合个人邮箱有限的情况Webhook则更适合接群机器人配置方式是在告警通道里填一个回调URL触发告警时服务端会POST一个JSON消息过去。我在实际使用中更喜欢Webhook因为告警能直接推到手机上而且可以自己写个小脚本把消息格式转成想要的模板。告警规则我常用的有三条模板CPU使用率超过90%持续5分钟、磁盘空间占用率超过85%、内存使用率持续超过90%达10分钟。注意“持续XX分钟”这个条件很重要没有持续时间限制的话瞬时尖峰就会触发告警半夜被误报吵醒几次你就知道这个参数值多少了。数据保留时长通过CM_RETENTION_DAYS控制我设置的30天。这个值直接影响磁盘占用和查询速度保留时间越长SQLite文件越大。单机几台服务器的话一个月数据也就几十MB完全不用担心但如果监控对象多建议保留7天就够毕竟基础监控指标超过一周的历史曲线说实话很少会回头翻。5. 常见问题与排查技巧实录5.1 Agent失联、数据不刷新这是监控平台最常见的故障没有之一。现象是面板上某台主机变灰曲线断更但Agent容器明明还在跑。我的排查方法是按链路从Agent到Server逐步走一遍别上来就怀疑代码。第一步在Agent容器里直接测到服务端的连通性docker exec -it coolmonitor-agent curl -v http://192.168.1.100:9009/healthz如果超时或连接拒绝说明网络层就不通去查防火墙和安全组。如果通了但提示没有权限或token错误说明Agent的身份信息不对检查CM_SERVER_URL和Agent注册时填写的token是否匹配。第二步看Agent日志里的上报状态码。正常情况每次上报都会返回200看到连接重置或超时就有方向了。第三步看server日志里有没有收到来自该Agent的请求。如果Agent日志显示成功但server没有任何记录多半是请求打到了别的实例或端口上仔细核对一下服务端IP和端口映射。还有一个特别容易忽略的原因时钟不同步。Agent和Server的系统时间差太多服务端会拒绝接收上报数据。这一条我踩过好几次尤其是在刚创建的云服务器上没配NTP同步时间漂了半分钟监控数据就断断续续。遇到离奇问题先看两边的date输出排除时钟因素再往下查。5.2 端口冲突、容器反复重启、日志怎么看部署时最常碰到的报错就是端口被占用。启动时提示port is already allocated说明宿主机上已经有进程在听这个端口了。先找出占用进程ss -lptn | grep 9009确定是哪个服务占用了端口要么停掉那个服务要么把compose文件里的端口映射改掉。这里我提醒一下改完端口别忘记同步修改Web端配置的API地址不然Web连不上Server前端页面全白。容器反复重启的场景docker compose ps下面会显示Restarting状态。这时候别去反复up -d先看日志docker compose logs -f --tail50 coolmonitor-server docker inspect coolmonitor-server | grep -A 5 ExitCode退出码是重要的线索。137一般表示进程被OOM Killer杀了也就是内存不够给容器加内存限制或者换大内存机器。143通常是被正常关闭的信号。如果日志里一直打印某种初始化失败多半是配置不对。另外可以用dmesg | grep -i oom看内核日志确认是不是内存溢出导致被杀。5.3 镜像拉取失败的解决办法镜像拉取失败在Docker部署里太常见了错误信息往往只有一句pull access denied或超时。这个问题的根源还是网络访问镜像仓库不稳定我的处理顺序是先把/etc/docker/daemon.json里的镜像加速地址检查一遍确认JSON没有语法错误加速地址没有填错然后重启Docker再重试。这一步能解决80%的问题。如果还是不行就用docker pull单独拉取目标镜像不带compose的干扰更容易看出问题在哪。拉取还失败的话试试换一个镜像源的加速地址。不同镜像仓库的连通性在不同地区表现差异很大多备几个加速地址轮着用是实用技巧。要是机器实在拉不下来可以在另一台能访问的环境上把镜像docker save成tar包再拷贝到目标机器上docker load导入。这个招数虽然土但任何时候都管用适合那种网络条件很极端的环境。5.4 数据卷权限与磁盘写满映射数据卷之后最容易碰到的是权限问题。容器内运行用户跟宿主机目录的属主不一致服务端会报Permission denied典型表现是服务能启动但写不了数据界面能看到页面但所有主机离线。解决办法是把宿主机数据目录的属主改成容器内用户的UIDchown -R 1000:1000 /opt/coolmonitor/dataUID数字以你实际镜像里运行用户为准不确定的情况下可以先进容器执行id看一下。改完属主再重启容器就能正常写入。磁盘写满的问题则是“温水煮青蛙”历史数据累积到一定程度才爆发。日常维护我建议关注两个目录一是/opt/coolmonitor/data的数据文件大小用du -sh定期看一眼二是Docker自身的日志目录/var/lib/docker/containers下各容器的json日志文件如果某个容器日志输出特别多又不轮转几个G的磁盘空间说没就没。清理的时候注意分寸。docker system prune -f能清掉无用的镜像和构建缓存但会删除所有未被使用的容器和网络资源生产环境不要随手乱执行。更稳妥的日常操作是缩短数据保留天数、设置容器的日志轮转参数、用cron定期滚动日志文件。这类基础维护没什么技术含量但能实实在在避免监控平台把自己监控死的尴尬局面。再说回这个话题本身。我实际用下来最大的感受是coolmonitor把一个监控平台最常用的部分做顺了部署简单、采集直接、界面不啰嗦适合不想为了看几台机器就引入一整套路由复杂组件的场景。如果你同样只是想把基础指标盯起来这套方案值得花一个下午去试。最后再分享一个小建议先在一台不重要的机器上把整套流程走通再往生产环境推进毕竟监控平台存在的意义是让你少操心别让它反过来变成你半夜爬起来处理的对象。