Docker-compose 实现Prometheus+Grafana监控MySQL及Linux主机

.
├── Grafana
│   ├── data
│   └── docker-compose.yaml
├── Mysql
│   ├── conf
│   ├── data
│   ├── docker-compose.yaml
│   └── logs
├── Mysqld_exporter
│   ├── conf
│   └── docker-compose.yaml
├── node-exporter
│   └── docker-compose.yaml
└── Prometheus
    ├── data
    ├── docker-compose.yaml
    └── yml
Prometheus
# Docker Compose 版本声明
version: '3'

# 定义服务列表,这里定义了一个名为 prometheus 的服务
services:
  # 服务名称:prometheus
  prometheus:
    # 使用的Docker镜像,这里是 Prometheus 监控系统的官方镜像
    image: prom/prometheus:v2.38.0
    # 为容器指定一个名称
    container_name: prometheus
    # 定义卷挂载,将主机目录挂载到容器内的目录
    volumes:
      # 挂载 Prometheus 配置文件到容器内
      - ./yml/prometheus.yml:/etc/prometheus/prometheus.yml
      # 挂载数据目录,用于存储 Prometheus 的数据
      - ./data:/prometheus
    # 自定义命令来启动 Prometheus 容器
    command:
      # 指定 Prometheus 配置文件的位置
      - '--config.file=/etc/prometheus/prometheus.yml'
      # 指定 Prometheus 数据存储的路径
      - '--storage.tsdb.path=/prometheus'
      # 指定控制台库的目录
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      # 指定控制台模板的目录
      - '--web.console.templates=/usr/share/prometheus/consoles'
      # 启用 Prometheus 的生命周期功能
      - '--web.enable-lifecycle'
    # 端口映射,将容器的9090端口映射到宿主机的9090端口
    ports:
      - "9090:9090"
    # 定义重启策略,除非明确停止,否则总是尝试重启容器
    restart: unless-stopped
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['192.168.88.128:9090']

  - job_name: 'grafana'                                                                                                                                                                        
    static_configs:
      - targets: ['192.168.88.128:3000']

  # 采集MySQL监控数据
  - job_name: 'mysqld_exporter'
    static_configs:
      - targets: ['192.168.88.128:9104']

  # 采集node exporter监控数据,即linux
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['192.168.88.128:9100']
Grafana

Grafana做持久化操作,使用MySQL,如果已有数据库直接使用,只需创建grafana库即可。

# Docker Compose 版本声明
version: '3'

# 定义服务列表,这里定义了一个名为 grafana 的服务
services:
  # 服务名称:grafana
  grafana:
    # 使用的Docker镜像,这里是 Grafana 的官方镜像,版本为 9.5.2
    image: grafana/grafana:9.5.2
    # 为容器指定一个名称
    container_name: grafana
    # 定义重启策略,除非明确停止,否则总是尝试重启容器
    restart: unless-stopped
    # 端口映射,将容器的3000端口映射到宿主机的3000端口,这是 Grafana 的默认端口
    ports:
      - "3000:3000"
    # 定义卷挂载,将主机目录挂载到容器内的目录
    volumes:
      # 将主机的数据目录挂载到 Grafana 的数据目录,用于数据持久化
      - "./data:/var/lib/grafana"
      # 将宿主机的 localtime 文件挂载到容器,保证容器内时间设置与宿主机一致
      - "/etc/localtime:/etc/localtime"
    # 设置环境变量,用于 Grafana 配置
    environment:
      # 开启 Grafana 的 Explore 功能
      GF_EXPLORE_ENABLED: "true"
      # 设置管理员用户的初始密码
      GF_SECURITY_ADMIN_PASSWORD: "zxcvbnm1"
      # 安装 Grafana 插件
      GF_INSTALL_PLUGINS: "grafana-clock-panel,grafana-simple-json-datasource,alexanderzobnin-zabbix-app"
      # 配置 Grafana 数据库连接信息,这里使用的是 MySQL 数据库
      GF_DATABASE_URL: "mysql://root:zxcvbnm1@192.168.88.128:3306/grafana"
      # 注释掉的设置,用于改变 Grafana 用户界面的语言
      # GF_VIEWER_LANGUAGE: "zh-Hans"
    # 定义依赖关系,确保在 Grafana 启动前 Prometheus 服务已经启动
    depends_on:
      - prometheus
MySQL

如果没有按照下面compose文件启动MySQL并创建库名。

# Docker Compose 版本声明
version: "3"

# 定义服务列表,这里定义了一个名为 mysql 的服务
services:
  # 服务名称:mysql
  mysql:
    # 使用的Docker镜像,这里是 MySQL 5.7 版本的官方镜像
    image: mysql:5.7
    # 为容器指定一个名称
    container_name: mysql
    # 定义重启策略,除非明确停止,否则总是尝试重启容器
    restart: unless-stopped
    # 定义卷挂载,将主机目录挂载到容器内的目录
    volumes:
      # 将主机的 my.cnf 配置文件挂载到容器的 MySQL 配置目录
      - "./conf/my.cnf:/etc/mysql/my.cnf"
      # 将主机的数据目录挂载到容器的 MySQL 数据目录,用于数据持久化
      - "./data:/var/lib/mysql"
    # 设置环境变量
    environment:
      # 设置时区
      TZ: Asia/Shanghai
      # 设置语言环境
      LANG: en_US.UTF-8
      # 设置 MySQL root 用户的密码
      MYSQL_ROOT_PASSWORD: zxcvbnm1
      # 注释掉的设置,如果需要创建并初始化一个数据库,可以取消注释并设置数据库名
      #MYSQL_DATABASE: "database"
    # 端口映射,将容器的3306端口映射到宿主机的3306端口,这是 MySQL 的默认端口
    ports:
      - "3306:3306"
[mysqld]
user=mysql                     # MySQL启动用户
default-storage-engine=INNODB  # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4      # 设置mysql服务端默认字符集
pid-file        = /var/run/mysqld/mysqld.pid  # pid文件所在目录
socket          = /var/run/mysqld/mysqld.sock # 用于本地连接的socket套接字
datadir         = /var/lib/mysql              # 数据文件存放的目录
#log-error      = /var/log/mysql/error.log
#bind-address   = 127.0.0.1                   # MySQL绑定IP
symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 定义mysql应该支持的sql语法,数据校验等!

# 允许最大连接数
max_connections=1000

# ================= ↓↓↓ mysql主从同步配置start ↓↓↓ =================

# 同一局域网内注意要唯一
server-id=3306
# 开启二进制日志功能 & 日志位置存放位置`/var/lib/mysql`
#log-bin=mysql-bin
log-bin=/var/lib/mysql/mysql-bin
# binlog格式
# 1. STATEMENT:基于SQL语句的模式,binlog 数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错;
# 2. MIXED:混合模式,根据语句来选用是 STATEMENT 还是 ROW 模式;
# 3. ROW:基于行的模式,记录的是行的完整变化。安全,但 binlog 会比其他两种模式大很多;
binlog_format=ROW
# FULL:binlog记录每一行的完整变更 MINIMAL:只记录影响后的行
binlog_row_image=FULL
# 日志文件大小
# max_binlog_size=100M
max_binlog_size=100M
# 定义清除过期日志的时间(这里设置为7天)
expire_logs_days=7

# ================= ↑↑↑ mysql主从同步配置end ↑↑↑ =================

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4  # 设置mysql客户端默认字符集
Mysqld_exporter监控MySQL
# Docker Compose 版本声明
version: "3"

# 定义服务列表,这里定义了一个名为 mysqld_exporter 的服务
services:
  # 服务名称:mysqld_exporter
  mysqld_exporter:
    # 使用的 Docker 镜像,这里是 prom/mysqld-exporter 的最新版本
    image: prom/mysqld-exporter:latest
    # 为容器指定一个名称
    container_name: mysqld_exporter
    # 定义重启策略,除非明确停止,否则总是尝试重启容器
    restart: unless-stopped
    # 端口映射,将容器的 9104 端口映射到宿主机的 9104 端口
    ports:
      - "9104:9104"
    # 自定义命令行参数,用于配置 mysqld-exporter
    command:
      # --mysqld.username 指定连接到 MySQL 服务器的用户名及密码
      # --mysqld.address 指定 MySQL 服务器的地址和端口
      - "--mysqld.username=root:zxcvbnm1"
      - "--mysqld.address=192.168.88.128:3306"

访问:http://192.168.88.128:9104/metrics
mysql_up 值为1才监控正常,否则失败。
image.png
填坑1:

docker-compose中网上很多使用一下参数
entrypoint:
  DATA_SOURCE_NAME: "mysqld_exporter:zxcvbnm1@(192.168.88.128:3306)/"

然后就一直报一个错误:
ts=2024-06-25T06:34:59.852Z caller=config.go:150 level=error msg="failed to validate config" section=client err="no user specified in section or parent"
ts=2024-06-25T06:34:59.852Z caller=mysqld_exporter.go:225 level=info msg="Error parsing host config" file=.my.cnf err="no configuration found"

填坑2:

docker-compose中网上也有使用映射配置文件操作
cat my.cnf 
[client]
user=root
password=zxcvbnm1
host=192.168.88.128
port=3306

compose文件映射
    - "./conf/my.cnf:/usr/local/mysqld_exporter/.my.cnf"
    command: "--config.file=/etc/mysqld_exporter/.my.cnf"

都会出现这个错误:
ts=2024-06-25T06:34:59.852Z caller=config.go:150 level=error msg="failed to validate config" section=client err="no user specified in section or parent"
ts=2024-06-25T06:34:59.852Z caller=mysqld_exporter.go:225 level=info msg="Error parsing host config" file=.my.cnf err="no configuration found"

费了大劲找到的解决方式:
https://discuss.prometheus.io/t/docker-compose-mysql-exporter-start-error/1734

Node-exporter
version: "3"

services:
  node-exporter:
    image: prom/node-exporter:v1.3.1
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"

所有compose文件启动之后,访问Prometheus http://192.168.88.128:9090/targets?search=
image.png
如上显示,所有组件全部正常启动。

  1. grafana访问地址:http://192.168.88.128:3000/ 默认登录账号密码:admin/zxcvbnm1
  2. prometheus访问地址:http://192.168.88.128:9090/targets?search=
  3. exporter访问地址:http://192.168.88.128:9100/metrics
  4. Mysqld_exporter访问地址:http://192.168.88.128:9104/metrics
配置数据源

Grafana配置prometheus数据源,登录成功后点击添加数据源。
prometheus.gif
配置完成之后导入监控模板
grafana面板资源:https://grafana.com/grafana/dashboards
Mysqld_exporter:https://grafana.com/grafana/dashboards/14057-mysql/
node-exporter:https://grafana.com/grafana/dashboards/8919

导入.gif
MySQL监控结果

mysql.gif
linux监控结果

Linux.gif

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
答:以下是一个示例的docker-compose.yml文件,用于启动PrometheusGrafana监控一个或多个应用程序: ``` version: '3' services: prometheus: image: prom/prometheus container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - '--config.file=/etc/prometheus/prometheus.yml' restart: always grafana: image: grafana/grafana container_name: grafana depends_on: - prometheus ports: - "3000:3000" environment: GF_SERVER_ROOT_URL: http://localhost:3000 GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin volumes: - ./grafana-data:/var/lib/grafana restart: always ``` 在该docker-compose.yml文件中,我们创建了两个服务:prometheusgrafanaPrometheus服务使用Prometheus Docker映像,并将端口映射到9090。它还将/prometheus.yml文件作为挂载卷传递给容器。在启动容器时,我们使用命令行参数来指定/config.file=/etc/prometheus/prometheus.yml。 Grafana服务程序使用Grafana Docker映像,并依赖于prometheus服务。Grafana服务映射端口3000,并将以下环境变量传递给容器:GF_SERVER_ROOT_URL:使用localhost:3000 (在该容器中内部)作为grafana的根URL,GF_SECURITY_ADMIN_USER和GF_SECURITY_ADMIN_PASSWORD管理Grafana管理员的凭据。此服务还挂载了grafana-data目录,以便可以在重启容器时保留所有Grafana的设置。 最后,我们定义了restart: always参数以确保容器在退出时自动重新启动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值