文章目录
- 1、项目架构图
- 1.1 架构组件
- 2、实际实施
- 2.1 安装docker
- 2.2 编写dockerfile文件
- 2.2.1 Prometheus
- 2.2.2 node_exporter
- 2.2.3 nginx+vts模块
- 2.2.4 nginx_exporeter 服务发现文件
- 2.2.5 maridb dockerfile文件
- 2.2.6 镜像总数
- 2.3 具体操作
- 2.3.1 Prometheus组件
- 2.3.2 nginx组件
- 2.3.3 mariadb组件
- 2.3.4 部署安装grafana
- 3、监控展示
- 4、总结
- 4.1、项目核心意义
- 4.2 、项目应用场景
1、项目架构图
1.1 架构组件
- MySQL 数据库 (3306端口)+ MySQL Exporter(9104 端口)
- Nginx (80)+ Nginx VTS Exporter(9913 端口)
- Prometheus (9090 端口)+node_exporter(9100)
- Grafana(3000 端口)
2、实际实施
2.1 安装docker
1:安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 #yum-utils 提供了 yum-config-manager
#device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
#Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。2:设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3:安装 Docker-CE
yum install -y docker-cesystemctl stop firewalld.servicesetenforce 0vim /etc/selinux/config
SELINUX=disabledsystemctl start docker.service
systemctl enable docker.service
------------------镜像加速--------------------------------
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
---------------------网络优化----------------------------------------
vim /etc/sysctl.conf
net.ipv4.ip_forward=1sysctl -p
service network restart
systemctl restart docker
---------------------------------------------------------------docker version #docker版本信息
Client: Docker Engine - CommunityVersion: 26.1.4API version: 1.45Go version: go1.21.11Git commit: 5650f9bBuilt: Wed Jun 5 11:32:04 2024OS/Arch: linux/amd64Context: defaultServer: Docker Engine - CommunityEngine:Version: 26.1.4API version: 1.45 (minimum version 1.24)Go version: go1.21.11Git commit: de5c9cfBuilt: Wed Jun 5 11:31:02 2024OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.6.33GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957runc:Version: 1.1.12GitCommit: v1.1.12-0-g51d5e94docker-init:Version: 0.19.0GitCommit: de40ad0
[root@localhost docker]#
2.2 编写dockerfile文件
我们一共需要编写5个dockerfile文件
2.2.1 Prometheus
FROM alpine:latest# 设置工作目录
WORKDIR /opt
COPY prometheus-2.35.0.linux-amd64.tar.gz /opt# 下载并解压Prometheus
RUN tar xf prometheus-2.35.0.linux-amd64.tar.gz && \mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus && \rm prometheus-2.35.0.linux-amd64.tar.gz# 创建Prometheus数据目录
RUN mkdir -p /usr/local/prometheus/data# 配置Prometheus服务
COPY prometheus.service /etc/systemd/system/prometheus.service# 暴露Prometheus默认端口
EXPOSE 9090# 设置启动命令
CMD ["/usr/local/prometheus/prometheus", \"--config.file=/usr/local/prometheus/prometheus.yml", \"--storage.tsdb.path=/usr/local/prometheus/data/", \"--storage.tsdb.retention=15d", \"--web.enable-lifecycle"]
2.2.2 node_exporter
FROM alpine:latest# 创建用户和目录
RUN adduser -D -H -s /sbin/nologin node_exporter# 设置工作目录
WORKDIR /optCOPY node_exporter-1.3.1.linux-amd64.tar.gz /opt# 下载Node Exporter
RUN tar xf node_exporter-1.3.1.linux-amd64.tar.gz && \mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/ && \rm -rf node_exporter-1.3.1.linux-amd64.tar.gz node_exporter-1.3.1.linux-amd64# 暴露端口
EXPOSE 9100# 以非root用户运行Node Exporter
USER node_exporter
CMD ["node_exporter"]
2.2.3 nginx+vts模块
FROM alpine:latest# 替换 Alpine 镜像源为国内镜像,加快下载速度
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories# 安装编译依赖
RUN apk add --no-cache gcc make libc-dev openssl-dev pcre-dev zlib-dev# 添加源码包
ADD nginx-1.18.0.tar.gz /opt
ADD nginx-module-vts-0.1.18.tar.gz /opt# 查看/opt目录内容,确认解压后的目录名
RUN ls -la /opt# 编译并安装 Nginx(使用通配符匹配模块目录)
RUN mkdir -p /usr/local/nginx-module-vts \&& mv /opt/nginx-module-vts-*/* /usr/local/nginx-module-vts/ \&& cd /opt/nginx-1.18.0 \&& ./configure --prefix=/usr/local/nginx \--add-module=/usr/local/nginx-module-vts \--with-http_stub_status_module \&& make \&& make install \&& ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx \&& adduser -D -H nginx \&& chown -R nginx:nginx /usr/local/nginx/# 安装 bash(如果需要)
RUN apk add --no-cache bash# 暴露端口并设置启动命令
EXPOSE 80EXPOSE 8080CMD ["nginx", "-g", "daemon off;"]
2.2.4 nginx_exporeter 服务发现文件
FROM alpine:latest# 设置工作目录
WORKDIR /optCOPY nginx-vts-exporter-0.10.3.linux-amd64.tar.gz /opt# 下载并解压nginx-vts-exporter
RUN tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz \&& mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/ \&& rm -rf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz nginx-vts-exporter-0.10.3.linux-amd64# 创建systemd服务文件目录
RUN mkdir -p /usr/lib/systemd/system# 添加nginx-exporter服务配置
COPY nginx-exporter.service /usr/lib/systemd/system/# 暴露默认端口
EXPOSE 9913# 启动nginx-exporter服务
CMD ["nginx-vts-exporter", "-nginx.scrape_uri=http://localhost:8080/status/format/json"]
2.2.5 maridb dockerfile文件
FROM mariadb:ltsRUN apt-get update && \apt-get install -y --no-install-recommends curl && \rm -rf /var/lib/apt/lists/*ADD mysqld_exporter-0.14.0.linux-amd64.tar.gz /opt
RUN cp /opt/mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/COPY my.cnf /root/.my.cnfEXPOSE 3306 9104
CMD ["sh", "-c", "mysqld & mysqld_exporter --config.my-cnf=/root/.my.cnf"]
2.2.6 镜像总数
【注】:tomcat不需要
2.3 具体操作
2.3.1 Prometheus组件
#创建数据卷
docker volume create promdocker run -itd --name prometheus1 -p 9090:9090 -v prom:/usr/local/prometheus custom-prometheus:2.35.0
docker run -itd --name prometheus-ex -p 9100:9100 node-exporter:latestcd volumes/prom/_data/
vim prometheus.yml #添加以下内容- job_name: nodesmetrics_path: "/metrics"static_configs:- targets:- 192.168.107.186:9100labels:service: master_sit- job_name: "mysql"metrics_path: "/metrics"static_configs:- targets: ["192.168.107.186:9104"]- job_name: nginxmetrics_path: "/metrics"static_configs:- targets:- 192.168.107.186:9913
2.3.2 nginx组件
docker volume create nginxdocker run -itd --name nginx01 -p80:80 -p8080:8080 -v nginx:/usr/local/nginx/conf nginx:1.18.0docker run -itd --name nginx-ex -p9913:9913 nginx-export:0.10.3 #http模块
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;#server模块server {vhost_traffic_status off;listen 8080;allow 127.0.0.1;# allow 192.168.110.128;location /nginx-status {stub_status on;access_log off;}location /status {vhost_traffic_status_display;vhost_traffic_status_display_format html;}}#重启容器
2.3.3 mariadb组件
#启动容器
docker run -itd --name mariadb -p3306:3306 -p9104:9104 mariadb:v1 [root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9908976de61 mariadb:v1 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 0.0.0.0:9104->9104/tcp, :::9104->9104/tcp mariadb
15976ff7f1b9 node-expoter:latest "node_exporter" 3 hours ago Exited (2) 37 minutes ago prom-ex
bf0686de6ae5 custom-prometheus:2.35.0 "/usr/local/promethe…" 3 hours ago Exited (0) 37 minutes ago [root@localhost docker]# docker exec -it --privileged=true mariadb /bin/bash
root@d9908976de61:/# service mariadb start* Starting MariaDB database server mariadbd ...【注意】:此时可能会出现启动失败的情况
2025-07-16 14:51:04 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
2025-07-16 14:51:04 0 [Note] InnoDB: log sequence number 37792; transaction id 4
2025-07-16 14:51:04 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2025-07-16 14:51:04 0 [Note] Plugin 'FEEDBACK' is disabled.
2025-07-16 14:51:04 0 [Note] Plugin 'wsrep-provider' is disabled.
2025-07-16 14:51:04 0 [ERROR] Could not open mysql.plugin table: "Table 'mysql.plugin' doesn't exist". Some plugins may be not loaded
2025-07-16 14:51:04 0 [Note] InnoDB: Buffer pool(s) load completed at 250716 14:51:04
2025-07-16 14:51:04 0 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist
2025-07-16 14:51:10 0 [Note] Server socket created on IP: '0.0.0.0'.
2025-07-16 14:51:10 0 [Note] Server socket created on IP: '::'.
2025-07-16 14:51:10 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.db' doesn't exist
2025-07-16 14:51:10 0 [ERROR] Aborting
250716 14:51:10 mysqld_safe mysqld from pid file /run/mysqld/mysqld.pid ended#如果启动失败,则输入此条命令
root@d9908976de61:/# mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql#初始情况,默认为没有密码,可以直接进入
root@d9908976de61:/# mariadb -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 11.8.2-MariaDB-ubu2404 mariadb.org binary distributionCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]>
2.3.4 部署安装grafana
yum install -y grafana-7.4.0-1.x86_64.rpm
systemctl start grafana-server#查看端口状态
[root@localhost _data]# ss -natp | grep 3000
LISTEN 0 128 :::3000 :::* users:(("grafana-server",pid=39012,fd=11))
[root@localhost _data]#
3、监控展示
nginx页面展示
nginx-vts模块展示
nginx-exporter 组件
mysql-exporter组件
Prometheus监控组件
grafana可视化界面
4、总结
这个基于 Docker 的 “Prometheus + Grafana 监控 MySQL 与 Nginx” 项目,核心意义在于通过标准化、轻量化的方式,实现对关键服务的可观测性,为系统稳定运行、问题排查和性能优化提供数据支撑。其设计(Docker 容器化、多组件联动、可视化展示)既解决了传统监控的部署复杂、环境依赖等问题,又能满足不同场景下的监控需求。
4.1、项目核心意义
- 实现 “可观测性”,降低系统风险
对于 MySQL(数据存储核心)和 Nginx(流量入口),一旦出现性能瓶颈(如 MySQL 连接数过高、Nginx 响应延迟)或故障(如服务宕机),可能直接影响业务可用性。
该项目通过 Prometheus 采集关键指标(如 MySQL 的 QPS、Nginx 的请求量),并通过 Grafana 可视化,让运维 / 开发人员能实时感知系统状态,避免 “故障发生后才被动发现” 的问题。 - 标准化部署,降低落地门槛
传统监控工具(如 Prometheus、Grafana)的部署需要手动配置依赖、调整参数,且不同环境(开发 / 测试 / 生产)可能出现配置不一致的问题。
项目通过 Docker 和 docker-compose 将所有组件(MySQL、Nginx、Exporter、Prometheus、Grafana)打包为容器,实现 “一键启动”,避免环境差异导致的部署问题,同时便于在不同场景中复用。
4.2 、项目应用场景
- 中小型企业 / 团队的服务监控(核心场景)
-
痛点:缺乏专职运维团队,需要 “简单、低成本” 的监控方案,覆盖核心服务(MySQL 数据库、Nginx 反向代理)。
-
适配性:
项目通过 Docker 容器化,无需复杂的服务器配置,只需一台服务器即可部署全套监控;且监控目标(MySQL、Nginx)本身也可容器化,适合中小型团队的 “轻量化部署” 需求。 -
具体作用:
实时监控 Nginx 是否有异常请求(如 4xx/5xx 错误激增,可能是攻击或接口故障);
监控 MySQL 的连接数、锁等待时间(避免因连接耗尽导致应用无法访问数据库)。
- 开发 / 测试环境的 “预监控”
-
痛点:开发或测试环境中,服务性能问题(如代码导致的 MySQL 频繁慢查询)若未提前发现,可能直接带入生产环境。
-
适配性:
项目可快速在开发 / 测试环境部署(容器化部署耗时短),提前监控服务在 “模拟流量” 下的表现(如通过 Nginx 模拟用户请求,观察 MySQL 是否扛住压力)。 -
具体作用:
开发阶段:通过监控发现代码中的性能问题(如接口调用导致 Nginx 响应延迟);
测试阶段:验证新功能上线后对 MySQL/Nginx 的影响(如是否新增了慢查询)。
- 容器化环境的监控(契合 Docker 生态)
-
痛点:如果 MySQL、Nginx 本身已通过 Docker 部署(如微服务架构中的容器化服务),传统基于 “物理机 / 虚拟机” 的监控工具可能无法适配(如无法识别容器内的服务指标)。
-
适配性:
项目本身基于 Docker 构建,Exporter(如 mysql-exporter、nginx-vts-exporter)可直接与容器内的 MySQL/Nginx 通信,采集容器内的指标,完美适配容器化环境。 -
具体作用:
监控容器内 MySQL 的资源占用(如 CPU、内存使用率),避免容器资源不足导致服务崩溃;
跟踪 Nginx 容器的流量(如不同容器实例的请求分配是否均衡)。
- 临时监控需求(如活动 / 促销期间)
-
痛点:电商促销、活动推广等场景中,流量可能突然激增,需要临时监控系统稳定性。
-
适配性:项目通过 docker-compose 可快速启动(无需长期部署),活动结束后可直接停止容器,满足 “临时、按需” 的监控需求。
-
具体作用:
实时监控 Nginx 的请求量和错误率,避免流量过载导致用户无法访问;
监控 MySQL 的读写压力,防止订单提交等核心操作因数据库卡顿失败
这个项目的核心价值是 “用轻量化、标准化的方式,让监控从‘复杂且高门槛’变为‘简单可落地’”,无论是中小型企业的日常运维、容器化环境的服务监控,还是临时活动的稳定性保障,都能通过它快速搭建起一套可用的监控体系,最终实现 “提前发现问题、减少故障影响、优化系统性能” 的目标。