Docker Compose 一键部署 Prometheus + Alertmanager + Grafana 完整监控方案

Prometheus的docker (compose)安装

一、Docker是什么

Docker 是一个开源的应用容器引擎,基于Go 语言 并遵从 Apache2.0 协议开源

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker从17.03 版本之后分为CE(Community Edition:社区版)和EE(EnterpriseEdition: 企业版),我们用社区版就可以了

应用程序部署方式的演变

在部署应用程序的方式上,主要经历了三个时代

。传统部署:互联网早期,会直接将应用程序部署在物理机上

1.优点: 简单,不需要其它技术的参与

2.缺点: 不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响

。虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境

1.优点: 程序环境不会相互产生影响,提供了一定程度的安全性

2.缺点: 增加了操作系统,浪费了部分资源


。容器化部署:与虚拟化类似,但是共享了操作系统。优点:

1.可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等

2.运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦

3.容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署

4.部署快速。

二、Docker环境的准备

2.1配置yum的docker源

2.2 安装docker

检查docker服务是否启动且开机自启动

复制代码
systemctl start docker
systemctl enable docker
systemctl status docker

查看docker版本能运行出,版本号说明安装成功

复制代码
docker -v

主要docker命令

复制代码
#查看docker中的已安装镜像列表
docker images

# 查看运行中的容器
docker ps   

# 显示所有容器(运行中、已停止、已退出)
docker ps -a

2.3安装docker-compose组件

Docker Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

快速编排:

1.有些复杂的程序部署组件有前后步骤/依赖关系

2.能实现程序的快速扩容+缩容

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器

优势

。避免了多次使用 Dockerfile、Build、Image 命令或者 DockerHub 拉取 Image(当前案例中,prometheus、grafana、node_exporter、alertmanager等需要分别拉取镜像images启动程序,使用了docker-compose则可以在一个yaml文件中一步启动)

。需要创建多个Container,多次编写启动命令:

。Container互相依赖的如何进行管理和编排(prometheus和其他组件有启动的依赖关系、先后顺序。用docker-compose的yaml文件可以比较方便的管理这类依赖)

安装

复制代码
#从github中拉取下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose

#设置文件具备执行权限
sudo chmod +x /usr/local/bin/docker-compose

#查看已安装的版本,如果能正常输出版本号说明安装compose完毕
docker-compose -v

主要的compose命令

复制代码
#启动一个compose
docker-compose up

#关闭一个compose
docker-compose down

三、Docker-compose安装Prometheus

3.1 主要文件及树形结构

root@localhost data\]# tree . └── docker-prometheus ├── alertmanager │ └── config.yml ├── docker-compose.yaml ├── grafana │ ├── config.monitoring │ └── provisioning └── prometheus ├── alert.yml └── prometheus.yml #### **3.2 创建基本目录结构** #切换到root用户 mkdir /data/docker-prometheus -p mkdir /data/docker-prometheus/{grafana,prometheus,alertmanager} -p cd /data/docker-prometheus/ #### **3.3 创建alertmanager的配置文件** vi alertmanager/config.yml global: # 163邮箱SMTP服务器 smtp_smarthost: 'smtp.163.com:465' # 发件邮箱 smtp_from: '17711712380@163.com' # 发件邮箱用户名 smtp_auth_username: '17711712380@163.com' # 发件邮箱密码(授权码) smtp_auth_password: 'GStn5dw5K4JntCiY' # 是否启用TLS smtp_require_tls: false route: # 按告警名称分组 group_by: ['alertname'] # 等待时间,看是否有更多告警一起发送 group_wait: 10s # 同一分组内发送新告警的等待时间 group_interval: 10s # 重复发送告警的时间间隔 repeat_interval: 10m # 默认接收器 receiver: 'email' receivers: # 接收器名称 - name: 'email' # 邮件配置 email_configs: # 收件邮箱 - to: '1814603398@qq.com' inhibit_rules: # 抑制规则:当有严重告警时,抑制对应的警告级别告警 - source_match: # 源告警(触发抑制的告警) severity: 'critical' target_match: # 目标告警(被抑制的告警) severity: 'warning' # 需要匹配的标签 equal: ['alertname', 'dev', 'instance'] #### **3.4 创建grafana的配置文件** vi grafana/config.monitoring # 设置管理员密码为 "123456" GF_SECURITY_ADMIN_PASSWORD=123456 # 禁止用户在 Grafana 网站自行注册账户。 GF_USERS_ALLOW_SIGN_UP=false #### **3.5 创建prometheus的配置文件** vi prometheus/prometheus.yml # 全局配置 global: scrape_interval: 60s # 将抓取间隔设置为每60秒一次。默认是每1分钟一次 evaluation_interval: 60s # 每60秒评估一次规则。默认是每1分钟一次 # Alertmanager 配置,告诉 Prometheus 把触发的告警发送到哪里 alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093'] # 告警规则文件配置 rule_files: - "alert.yml" # 抓取配置(一共创建四个Prometheus监控项) scrape_configs: # 1. Prometheus 自身监控,确保监控系统本身正常工作 - job_name: 'prometheus' scrape_interval: 60s # 覆盖全局默认值,每60秒从该作业中抓取一次目标 static_configs: - targets: ['localhost:9090'] # 2. Alertmanager 监控,alertmanager 是Docker容器名,需要在同一Docker网络 - job_name: 'alertmanager' scrape_interval: 60s static_configs: - targets: ['alertmanager:9093'] # 3. cAdvisor 容器监控,Google开发的容器监控工具 - job_name: 'cadvisor' scrape_interval: 60s static_configs: - targets: ['cadvisor:8080'] labels: instance: 'Prometheus服务器' # 4. Node Exporter 主机监控,监控Linux主机指标的工具 - job_name: 'node-exporter' scrape_interval: 15s static_configs: - targets: ['node-exporter:9100'] labels: instance: 'Prometheus服务器' #### **3.6 创建prometheus的告警文件** vi prometheus/alert.yml groups: - name: Prometheus_alert rules: # 对任何实例超过30秒无法联系的情况发出警报 - alert: 服务告警 expr: up == 0 #触发条件 (expr),up = 0:监控目标不可达,抓取失败 for: 30s labels: severity: critical annotations: summary: "服务异常,实例: {{ $labels.instance }}" description: "{{ $labels.job }} 服务已关闭超过30秒" #### **3.7创建docker-compose.yaml文件**(我是rockylinux9.6) yaml中指定的镜像版本与前述二进制安装中的各组件版本保持一致。cadvisor表示普罗米修斯对docker平台的监控组件,此处采用v0.47.2 | 镜像名 | 版本号 | |---------------|---------| | prometheus | v2.45.5 | | alertmanager | v0.27.0 | | node-exporter | v1.8.0 | | grafana | 9.3.16 | | cadvisor | v0.47.2 | vi docker-compose.yaml #\[root@localhost docker-prometheus\]# vi docker-compose.yaml version: '3.3' # 存储卷 volumes: prometheus_data: {} # 持久化Prometheus数据 grafana_data: {} # 持久化Grafana配置 networks: monitoring: #为监控栈创建的自定义网络的名称。所有加入此网络的服务(通过 networks: - monitoring),就如同连接到了同一个内部局域网。 driver: bridge services: prometheus: image: prom/prometheus:v2.45.5 container_name: prometheus restart: always # 容器退出时会自动重启 #宿主机"指的就是运行Docker引擎的那台物理服务器或云虚拟机。 volumes: #下面三个都是 "将外部存储挂载到容器内部",其中两个外部存储直接指向宿主机路径,另一个指向Docker管理的抽象卷。 - /etc/localtime:/etc/localtime:ro # 同步宿主机时间。将宿主机的时间文件只读挂载到容器内,使容器时间与宿主机一致。 - ./prometheus/:/etc/prometheus/ # 提供配置文件。将宿主机当前目录下的 prometheus/ 文件夹,挂载为容器内的配置目录。这是你管理配置的主要方式。 - prometheus_data:/prometheus # 持久化存储数据。将Docker管理的名为 prometheus_data 的存储卷,挂载到容器内,用于保存监控数据库。确保数据不丢失。 command: - '--config.file=/etc/prometheus/prometheus.yml' #核心配置文件路径。指定 Prometheus 从容器内的 /etc/prometheus/prometheus.yml 文件读取其主配置。这个路径与你之前的卷挂载 ./prometheus/:/etc/prometheus/ 直接对应,使你可以在宿主机上管理配置。 - '--storage.tsdb.path=/prometheus' #数据存储路径。指定 Prometheus 将其时序数据库(TSDB)文件写入容器内的 /prometheus 目录。这个路径与你挂载的 prometheus_data 命名卷对应,确保了监控历史数据的持久化。 - '--web.console.libraries=/usr/share/prometheus/console_libraries' #控制台模板库路径。指定 Web 控制台使用的 JavaScript 库的目录。通常使用镜像内的默认值,无需更改。 - '--web.console.templates=/usr/share/prometheus/consoles' #控制台模板路径。指定 Web 控制台使用的 HTML 模板文件的目录。通常也使用默认值。 - '--web.enable-lifecycle' #开启后,你可以通过向 Prometheus 发送一个 HTTP POST 请求,来热重载配置文件,而无需重启整个服务,避免了监控中断。 - '--storage.tsdb.retention.time=30d' networks: - monitoring #指定该服务应该加入到名为 monitoring 的自定义Docker网络中。 links: #不必须,现代版本的 Docker 中,只要服务位于同一自定义网络(如这里的 monitoring),它们就可以互相解析对方的服务名 - alertmanager - cadvisor - node-exporter expose: #告知 Docker 该容器监听的内部端口号(这里是9090) - '9090' ports: #将容器的内部端口(左边的9090)映射到宿主机上的端口(右边的9090),意味着你可以在宿主机上通过访问 localhost:9090 来直接访问 Prometheus 的Web界面。 - '9090:9090' depends_on: #确保在启动 prometheus 容器之前,先启动 cadvisor 容器。 - cadvisor alertmanager: image: prom/alertmanager:v0.27.0 container_name: alertmanager #为容器命名,便于管理。 restart: always #宕机自动重启,保证告警服务高可用。 volumes: - /etc/localtime:/etc/localtime:ro # 同步宿主机时间,确保告警时间戳准确。 - ./alertmanager/:/etc/alertmanager/ #核心挂载。将宿主机当前目录下的 ./alertmanager/ 文件夹,挂载到容器内的配置目录 /etc/alertmanager/。你必须在此目录下创建 config.yml 配置文件。 command: - '--config.file=/etc/alertmanager/config.yml' #指定配置文件路径,指向上面挂载的目录中的文件。 - '--storage.path=/alertmanager' #重要参数。指定Alertmanager内部数据(如静默状态、通知历史)的存储路径。 networks: #加入监控专用网络,使Prometheus能通过 alertmanager:9093 域名向其发送告警。 - monitoring expose: #将9093端口暴露给同一Docker网络(如 monitoring)内的其他容器。这是为了让Prometheus容器能够访问它。 - '9093' ports: #端口映射。将容器内的9093端口映射到宿主机的9093端口,使你能够通过浏览器访问 http://<宿主机IP>:9093 来打开Alertmanager的Web管理界面。 - '9093:9093' cadvisor: #它是整个监控栈的"容器资源探针",专门负责自动收集宿主机上所有运行容器的实时性能数据。 image: m.daocloud.io/gcr.io/cadvisor/cadvisor:v0.47.2 container_name: cadvisor #指定容器名称,便于管理。 restart: always #确保服务中断后自动重启。 volumes: - /etc/localtime:/etc/localtime:ro #同步宿主机时间 - /:/rootfs:ro #挂载宿主机根目录(只读)。cAdvisor从这里读取主机整体的文件系统使用情况、容器镜像层等信息。 - /var/run:/var/run:rw #挂载Docker运行时目录(读写)。这是唯一需要读写权限的挂载。cAdvisor通过该目录下的Unix套接字(如 /var/run/docker.sock)与Docker守护进程通信,动态发现和查询所有容器的详细信息(如状态、配置)。 - /sys/fs/cgroup:/sys/fs/cgroup:ro #挂载系统信息目录(只读)。/sys 是Linux内核暴露硬件和设备信息的虚拟文件系统,cAdvisor从这里获取CPU、内存、网络设备等全局硬件指标。 - /var/lib/docker/:/var/lib/docker:ro #挂载Docker数据目录(只读)。这里存储了容器的镜像、可写层等实际数据,cAdvisor通过分析它来计算各容器的精确磁盘使用量。 networks: #加入监控专用网络,使Prometheus能通过 cadvisor:8080 访问其指标接口。 - monitoring expose: #仅暴露端口给内部网络。但不映射到宿主机。 - '8080' node-exporter: #它是监控栈的 "主机资源探针" ,专门负责收集宿主机本身(即运行Docker的虚拟机或物理服务器)的硬件和操作系统级指标,与 cAdvisor 形成互补。 image: prom/node-exporter:v1.8.0 container_name: node-exporter #指定容器名称。 restart: always # 确保服务中断后自动重启。 volumes: - /etc/localtime:/etc/localtime:ro #同步宿主机时间。 - /proc:/host/proc:ro #挂载进程信息目录(只读)。Linux的 /proc 虚拟文件系统包含所有进程和内核状态信息(如CPU、内存、任务列表)。这是获取CPU使用率、内存详情、进程统计的关键。 - /sys:/host/sys:ro #挂载系统设备目录(只读)。Linux的 /sys 虚拟文件系统暴露硬件设备、驱动和内核参数信息。用于获取磁盘I/O、网络统计、温度(如有)等指标。 - /:/rootfs:ro #挂载根文件系统(只读)。主要用于计算整个主机和各挂载点的磁盘使用情况。 command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host)' networks: #加入监控专用网络,使Prometheus能通过 node-exporter:9100 访问其指标接口。 - monitoring ports: #端口映射。将容器内的9100指标端口映射到宿主机的9100端口。 - '9100:9100' grafana: image: grafana/grafana:9.3.16 container_name: grafana restart: always user: "472:472" #关键修改:指定以Grafana官方用户运行,避免权限问题 volumes: - /etc/localtime:/etc/localtime:ro - grafana_data:/var/lib/grafana - ./grafana/provisioning/:/etc/grafana/provisioning/ env_file: - ./grafana/config.monitoring networks: - monitoring links: - prometheus ports: - '3000:3000' depends_on: - prometheus #### **3.8 运行docker-compose** 执行docker-compose.yaml文件之前先执行:**此命令只需在首次启动前执行一次**。它会将数据卷的所有权赋予Grafana容器用户, Grafana 官方镜像出于安全考虑,默认强制使用一个非 root 的专用用户来运行,这个用户在镜像内的**用户ID(UID)就是 472**。 [root@localhost docker-prometheus]# cd /data/docker-prometheus [root@localhost docker-prometheus]# docker run --rm -v grafana_data:/var/lib/grafana alpine chown -R 472:472 /var/lib/grafana [root@localhost docker-prometheus]# docker-compose up -d ...... Creating cadvisor ... done Creating alertmanager ... done Creating node-exporter ... done Creating prometheus ... done Creating grafana ... done 运行时间较慢。需要拉取若干docker镜像文件,运行完毕不报错说明成功 #### **3.9 检查compose的运行状态** 检查镜像,发现5个镜像都已正常拉取 docker images 检查容器,发现五个容器都处于up运行状态 ![](https://i-blog.csdnimg.cn/direct/28d870436a604196bc2c19e85e5967b6.png) 检查端口 ss -lntp|egrep "3000|9090|9100|9093" ![](https://i-blog.csdnimg.cn/direct/43e8a5be5c9c4600a64b1d50f8f1d2b2.png) web访问地址 | 应用 | 访问地址 | 账号密码 | |---------------|------------------------------------------------------------------------------------------------------------|--------------| | prometheus | [http://192.168.92.11:9090/](http://192.168.92.11:9090/ "http://192.168.92.11:9090/") | 无 | | grafana | [http://192.168.92.11:3000/](http://192.168.92.11:3000/ "http://192.168.92.11:3000/") | admin/123456 | | alertmanager | [http://192.168.92.11:9093/](http://192.168.92.11:9093/ "http://192.168.92.11:9093/") | 无 | | node_exporter | [http://192.168.92.11:9100/metrics](http://192.168.92.11:9100/metrics "http://192.168.92.11:9100/metrics") | 无 | 配置grafana的数据源 。访问grafana [http://192.168.92.11:3000/](http://192.168.92.11:3000/ "http://192.168.92.11:3000/") 。选择配置-\>Data sources ![](https://i-blog.csdnimg.cn/direct/55702ae99bf6454f9df9d02587784129.png) 只要配置url,然后点save\&test就可以 添加node_exporter 。访问grafana官网 [https://grafana.com/grafana/dashboards/](https://grafana.com/grafana/dashboards/ "https://grafana.com/grafana/dashboards/") 找到node exporter full的插件 ![](https://i-blog.csdnimg.cn/direct/7cff8b4434eb45549006dcaa51c4c749.png) ![](https://i-blog.csdnimg.cn/direct/f96b74eadc454ad8ad7243f234a91694.png) ![](https://i-blog.csdnimg.cn/direct/b2fa047c1ebf45c389aada7eacd12716.png) 。即可在grafana中查看监控数据 ![](https://i-blog.csdnimg.cn/direct/6279392eaf87469dbdfed6db482eaa31.png)

相关推荐
xixingzhe21 小时前
Prometheus+Grafana监控服务器
grafana·prometheus
hopsky2 小时前
Docker Desktop 报 500
运维·docker·容器
曦云沐2 小时前
一键部署ROS2开发环境!Docker run命令详解与实战
docker·容器·ros2
H Journey2 小时前
Docker swarm 集群搭建实战
运维·docker·容器
江湖有缘3 小时前
Docker环境下使用RustScan端口扫描工具教程
运维·docker·容器
70asunflower3 小时前
镜像仓库(Image Registries)详解
linux·docker·容器
青树寒鸦3 小时前
wsl的docker备份redis和迁移
redis·docker·容器
岩屿3 小时前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
hopsky4 小时前
限制 Docker Desktop 的资源使用
运维·docker·容器
春日见4 小时前
docker崩溃,闪退,与vscode断开连接
vscode·docker·容器