1. 为什么选择Docker部署监控系统?
在分布式系统和微服务架构盛行的当下,传统的监控方式已经难以满足需求。我曾经在物理服务器上直接部署Prometheus,每次版本升级或配置变更都需要手动操作,不仅耗时耗力,还经常因为环境差异导致监控中断。直到尝试了Docker化部署,才发现这才是监控系统该有的样子。
Docker带来的最大优势是环境一致性。想象一下,当你需要在开发、测试、生产三个环境部署完全相同的监控栈时,传统方式需要重复配置三次,而Docker只需要一条docker-compose up -d命令。我在去年的一次紧急扩容中,仅用15分钟就完成了从单节点到集群的监控系统扩展,这完全得益于容器化的封装特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖检查
2.1 宿主机环境要求
虽然Docker具有很好的跨平台性,但根据我的踩坑经验,Linux宿主机的稳定性远胜于Windows。特别是对于长期运行的监控系统,建议选择:
- 操作系统:Ubuntu 20.04 LTS或CentOS 7.9+
- 内核版本:5.4+(低版本内核可能遇到cgroup问题)
- 资源分配:至少2核CPU/4GB内存/50GB磁盘(监控数据增长很快)
- 网络配置:确保宿主机的8080(Grafana)、9090(Prometheus)、9100(node-exporter)端口可用
重要提示:如果在Windows/Mac上使用Docker Desktop,务必在Settings → Resources中调高CPU和内存限制。我曾因为默认2GB内存限制导致Prometheus频繁OOM崩溃。
2.2 Docker环境配置
bash复制# 安装最新版Docker(已安装可跳过)
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker
# 验证安装
docker version
docker run hello-world
# 安装docker-compose(推荐v2+)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3. 编写docker-compose编排文件
3.1 基础架构设计
经过多次实践验证,我总结出这套黄金组合的部署架构:
code复制监控系统栈
├── Prometheus(时序数据库+告警规则)
├── Grafana(可视化仪表板)
└── node-exporter(主机指标采集)
创建项目目录结构:
bash复制mkdir -p ~/monitoring/{prometheus,grafana}
cd ~/monitoring
3.2 docker-compose.yml详解
yaml复制version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d' # 数据保留30天
depends_on:
- node-exporter
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
depends_on:
- prometheus
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
volumes:
prometheus_data:
grafana_data:
关键配置说明:
volumes挂载实现配置持久化restart: unless-stopped确保异常退出后自动恢复- Prometheus的30天数据保留策略平衡了存储成本和监控需求
- node-exporter通过挂载系统目录获取主机指标
4. Prometheus核心配置
4.1 prometheus.yml配置
在~/monitoring/prometheus/目录下创建配置文件:
yaml复制global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
metrics_path: '/metrics'
4.2 配置验证技巧
启动前建议先验证配置语法:
bash复制docker run --rm -v $(pwd)/prometheus/prometheus.yml:/tmp/prometheus.yml prom/prometheus:latest \
check config /tmp/prometheus.yml
我曾因为一个缩进错误导致Prometheus无法启动,这个检查步骤能避免很多低级错误。
5. 启动与初始化
5.1 一键启动所有服务
bash复制docker-compose up -d
验证服务状态:
bash复制docker-compose ps
预期输出:
code复制 Name Command State Ports
--------------------------------------------------------------------------------
grafana /run.sh Up 0.0.0.0:3000->3000/tcp
node-exporter /bin/node_exporter --path ... Up 0.0.0.0:9100->9100/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
5.2 Grafana初始配置
- 访问
http://<服务器IP>:3000,使用admin/admin123登录 - 添加Prometheus数据源:
- 类型:Prometheus
- URL:http://prometheus:9090
- 其他保持默认
- 导入Node Exporter仪表板:
- 点击"+" → Import
- 输入仪表板ID
1860 - 选择Prometheus数据源
专业建议:Grafana的"Explore"功能是排查指标问题的利器。我经常用它实时查询PromQL验证监控项是否正常采集。
6. 高级配置与优化
6.1 时区问题解决方案
容器默认使用UTC时区,会导致告警时间显示异常。修改docker-compose.yml:
yaml复制grafana:
environment:
- TZ=Asia/Shanghai
- GF_DEFAULT_INSTANCE_TIMEZONE=Asia/Shanghai
prometheus:
environment:
- TZ=Asia/Shanghai
6.2 资源限制与调优
为防止监控系统本身影响业务,建议添加资源限制:
yaml复制prometheus:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
memory: 2G
grafana:
deploy:
resources:
limits:
memory: 2G
6.3 数据持久化验证
执行以下命令检查数据卷:
bash复制docker volume inspect monitoring_prometheus_data
docker volume inspect monitoring_grafana_data
确保"Mountpoint"指向正确的宿主机路径。我曾因为权限问题导致Grafana仪表板无法保存,最终发现是SELinux限制了Docker的写入权限。
7. 常见问题排查指南
7.1 node-exporter指标缺失
症状:Grafana仪表板显示"No data"
排查步骤:
- 检查node-exporter容器日志:
bash复制
docker logs node-exporter - 手动访问指标接口:
bash复制
curl http://localhost:9100/metrics - 验证Prometheus抓取配置:
bash复制docker exec -it prometheus sh wget -qO- http://node-exporter:9100/metrics | head
7.2 Prometheus存储问题
当出现"storage not ready"错误时:
- 检查数据目录权限:
bash复制docker exec prometheus ls -l /prometheus - 清理损坏的WAL日志:
bash复制docker stop prometheus docker run --rm -v monitoring_prometheus_data:/prometheus \ prom/prometheus:latest promtool tsdb repair /prometheus docker start prometheus
7.3 Grafana登录循环
这是Cookie设置问题,解决方法:
- 修改grafana.ini:
ini复制[security] cookie_secure = false - 或者通过环境变量:
yaml复制environment: - GF_SERVER_DOMAIN=yourdomain.com - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/
8. 生产环境部署建议
经过多个项目的实践验证,我总结出这些关键经验:
-
高可用方案:运行两个Prometheus实例,配置相同的抓取规则,使用Grafana的"HA Data Source"插件实现自动切换
-
监控项优化:修改node-exporter启动参数,禁用不用的采集器减少负载:
yaml复制command: - '--no-collector.arp' - '--no-collector.bcache' -
安全加固:
- 为Grafana配置HTTPS
- 使用
--web.config.file为Prometheus启用TLS - 设置防火墙规则限制访问IP
-
备份策略:
bash复制# Prometheus快照备份 docker exec prometheus curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot # Grafana定期导出仪表板 find grafana_data/ -name "*.json" -exec cp {} /backup/ \;
这套监控方案已经在我负责的多个生产环境中稳定运行,最长的已经持续工作478天。记住监控系统的黄金法则:先让它监控自己,再监控其他。定期检查Prometheus的up指标和Grafana的自身监控仪表板,确保监控系统本身健康运行。
