文章目錄
- 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 的讀寫壓力,防止訂單提交等核心操作因數據庫卡頓失敗
這個項目的核心價值是 “用輕量化、標準化的方式,讓監控從‘復雜且高門檻’變為‘簡單可落地’”,無論是中小型企業的日常運維、容器化環境的服務監控,還是臨時活動的穩定性保障,都能通過它快速搭建起一套可用的監控體系,最終實現 “提前發現問題、減少故障影響、優化系統性能” 的目標。