1. 项目概述
在AlmaLinux系统上通过容器化方式部署Prometheus+Grafana监控套件,是当前企业级监控系统搭建的主流方案之一。作为CentOS的替代品,AlmaLinux凭借其稳定性和长期支持特性,成为众多运维团队的首选操作系统。而将Prometheus(指标采集)与Grafana(数据可视化)这两个黄金组合以Docker容器方式部署,既能保证环境隔离,又能简化依赖管理。
我最近在客户生产环境中实际部署了这套监控系统,发现相比传统二进制安装方式,容器化部署可以节省约60%的配置时间,且更容易实现版本管理和快速迁移。下面将详细介绍从零开始完成整套部署的关键步骤和实战技巧。
2. 环境准备
2.1 系统基础配置
首先确保使用AlmaLinux 8或9版本(推荐9.3+),执行系统更新:
sudo dnf update -y && sudo dnf install -y yum-utils device-mapper-persistent-data lvm2注意:如果是从CentOS迁移过来的系统,建议检查/etc/os-release确认系统类型,避免残留的CentOS源导致依赖冲突。
2.2 Docker环境安装
- 添加Docker官方仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo- 安装Docker引擎:
sudo dnf install -y docker-ce docker-ce-cli containerd.io- 启动并设置开机自启:
sudo systemctl enable --now docker- 验证安装:
sudo docker run hello-world2.3 防火墙与SELinux配置
AlmaLinux默认启用了firewalld和SELinux,需要适当调整:
# 放行Docker使用的端口范围 sudo firewall-cmd --permanent --zone=public --add-port=3000/tcp # Grafana sudo firewall-cmd --permanent --zone=public --add-port=9090/tcp # Prometheus sudo firewall-cmd --reload # SELinux设置为permissive模式(生产环境建议保持enforcing并配置正确策略) sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config3. Prometheus容器化部署
3.1 配置文件准备
创建配置目录结构:
mkdir -p ~/monitoring/prometheus/{data,conf} chmod 777 ~/monitoring/prometheus/data # 确保容器有写入权限编写Prometheus主配置文件~/monitoring/prometheus/conf/prometheus.yml:
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']3.2 启动Prometheus容器
使用官方镜像运行容器:
docker run -d \ --name=prometheus \ --restart=always \ -p 9090:9090 \ -v ~/monitoring/prometheus/conf:/etc/prometheus \ -v ~/monitoring/prometheus/data:/prometheus \ prom/prometheus:latest \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/prometheus \ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries关键参数说明:
--restart=always:确保容器异常退出后自动重启-v挂载卷:持久化配置和时序数据--storage.tsdb.path:指定TSDB存储路径
3.3 验证部署
访问http://<服务器IP>:9090应该能看到Prometheus Web界面。通过Status > Targets可以查看当前监控目标状态。
4. Grafana容器化部署
4.1 启动Grafana容器
docker run -d \ --name=grafana \ --restart=always \ -p 3000:3000 \ -v ~/monitoring/grafana/data:/var/lib/grafana \ grafana/grafana-oss:latest4.2 初始配置
- 访问
http://<服务器IP>:3000,默认账号admin/admin - 首次登录会要求修改密码
- 添加Prometheus数据源:
- Configuration > Data Sources > Add data source
- 选择Prometheus
- URL填写
http://<prometheus容器IP>:9090 - 点击Save & Test
技巧:如果不知道Prometheus容器IP,可以用
docker inspect prometheus | grep IPAddress查询
4.3 导入仪表盘
Grafana官方提供丰富的仪表盘模板:
- 导航到Dashboards > New > Import
- 输入模板ID(如1860用于Node Exporter仪表盘)
- 选择刚添加的Prometheus数据源
- 点击Import完成导入
5. 进阶配置与优化
5.1 使用Docker Compose编排
创建docker-compose.yml统一管理服务:
version: '3' services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: always ports: - "9090:9090" volumes: - ./prometheus/conf:/etc/prometheus - ./prometheus/data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.templates=/etc/prometheus/consoles' - '--web.console.libraries=/etc/prometheus/console_libraries' grafana: image: grafana/grafana-oss:latest container_name: grafana restart: always ports: - "3000:3000" volumes: - ./grafana/data:/var/lib/grafana depends_on: - prometheus启动服务:
docker-compose up -d5.2 添加Node Exporter监控主机
在需要监控的机器上运行:
docker run -d \ --name=node_exporter \ --restart=always \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \ prom/node-exporter:latest \ --path.rootfs=/host然后在Prometheus配置中添加job:
scrape_configs: - job_name: 'node' static_configs: - targets: ['<主机IP>:9100']5.3 配置告警规则
在prometheus.yml同目录创建alerts.yml:
groups: - name: host_stats rules: - alert: HighMemoryUsage expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 90 for: 5m labels: severity: warning annotations: summary: "High memory usage on {{ $labels.instance }}" description: "Memory usage is {{ $value }}%"在prometheus.yml中启用告警规则:
rule_files: - 'alerts.yml'6. 常见问题排查
6.1 容器无法访问外部网络
现象:Prometheus无法抓取其他主机的exporter数据
解决方案:
# 检查Docker网络模式 docker network inspect bridge # 临时解决方案:使用host网络模式 docker run --net=host ...6.2 数据卷权限问题
现象:容器启动失败,日志显示"permission denied"
解决方案:
# 递归修改数据目录权限 sudo chown -R 472:472 ~/monitoring/grafana/data sudo chown -R nobody:nobody ~/monitoring/prometheus/data6.3 Prometheus存储优化
对于长期运行的监控系统,需要调整TSDB配置:
# 在prometheus.yml中添加 storage: tsdb: retention: 15d # 数据保留周期 wal_compression: true # 启用WAL压缩7. 生产环境建议
资源限制:为容器设置合理的CPU和内存限制
docker run --memory="2g" --cpus="1" ...日志管理:配置日志轮转
docker run --log-driver=json-file --log-opt max-size=50m --log-opt max-file=3 ...备份策略:定期备份重要数据
# 备份Prometheus数据 tar czvf prometheus_backup.tar.gz ~/monitoring/prometheus/data # 备份Grafana配置 docker exec grafana grafana-cli admin backup <backup-file>HTTPS配置:通过Nginx反向代理添加SSL证书
高可用方案:考虑部署Prometheus HA集群和Grafana多实例
这套容器化监控方案已经在多个生产环境稳定运行,相比传统部署方式,最大的优势在于:
- 环境隔离:避免与系统其他服务产生依赖冲突
- 快速部署:全新环境10分钟内可完成全套部署
- 易于维护:通过容器编排工具实现一键更新和回滚
- 资源可控:精确限制每个组件的资源使用量
实际使用中建议配合cAdvisor实现容器监控,再结合Alertmanager构建完整的告警体系。对于大规模环境,可以考虑使用VictoriaMetrics替代Prometheus以获得更好的性能。