AlmaLinux容器化部署Prometheus+Grafana监控系统实战

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环境安装

  1. 添加Docker官方仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装Docker引擎:
sudo dnf install -y docker-ce docker-ce-cli containerd.io
  1. 启动并设置开机自启:
sudo systemctl enable --now docker
  1. 验证安装:
sudo docker run hello-world

2.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/config

3. 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:latest

4.2 初始配置

  1. 访问http://<服务器IP>:3000,默认账号admin/admin
  2. 首次登录会要求修改密码
  3. 添加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官方提供丰富的仪表盘模板:

  1. 导航到Dashboards > New > Import
  2. 输入模板ID(如1860用于Node Exporter仪表盘)
  3. 选择刚添加的Prometheus数据源
  4. 点击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 -d

5.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/data

6.3 Prometheus存储优化

对于长期运行的监控系统,需要调整TSDB配置:

# 在prometheus.yml中添加 storage: tsdb: retention: 15d # 数据保留周期 wal_compression: true # 启用WAL压缩

7. 生产环境建议

  1. 资源限制:为容器设置合理的CPU和内存限制

    docker run --memory="2g" --cpus="1" ...
  2. 日志管理:配置日志轮转

    docker run --log-driver=json-file --log-opt max-size=50m --log-opt max-file=3 ...
  3. 备份策略:定期备份重要数据

    # 备份Prometheus数据 tar czvf prometheus_backup.tar.gz ~/monitoring/prometheus/data # 备份Grafana配置 docker exec grafana grafana-cli admin backup <backup-file>
  4. HTTPS配置:通过Nginx反向代理添加SSL证书

  5. 高可用方案:考虑部署Prometheus HA集群和Grafana多实例

这套容器化监控方案已经在多个生产环境稳定运行,相比传统部署方式,最大的优势在于:

  • 环境隔离:避免与系统其他服务产生依赖冲突
  • 快速部署:全新环境10分钟内可完成全套部署
  • 易于维护:通过容器编排工具实现一键更新和回滚
  • 资源可控:精确限制每个组件的资源使用量

实际使用中建议配合cAdvisor实现容器监控,再结合Alertmanager构建完整的告警体系。对于大规模环境,可以考虑使用VictoriaMetrics替代Prometheus以获得更好的性能。