Docker容器实践——使用docker-compose部署wordpress应用与prometheus监控

Docker容器实践------Docker常用基础镜像的解析与选择https://coffeemilk.blog.csdn.net/article/details/160505593?spm=1001.2014.3001.5502Docker容器实践------Docker-Compose实现多容器的控制https://coffeemilk.blog.csdn.net/article/details/160418801?spm=1001.2014.3001.5502

一、使用docker-compose一键部署wordpress应用

在使用compose编写一个容器应用时,需要了解应用的运行逻辑。本例中,wordpress是一个博客系统,基于PHP语言编写,数据可以存储在MySQL中,因此,在部署这个应用之前,至少需要构建mysql和wordpress 2个镜像,wordpress镜像可以使用apache+php方式,wordpress程序也可以放到wordpress这个镜像中;而mysql可以独立构建一个镜像,或者使用dockerhub官方给的mysql镜像也是可以的。

复制代码
#本文一键构建wordpress应用的生产环境架构说明
#采用 3 容器 + 数据持久化 架构:
#1-WordPress (PHP+Apache):主程序
#2-MySQL 8.0:数据库(生产稳定版)
#3-Nginx:反向代理、HTTPS、静态资源缓存
#4-数据持久化:网站文件、数据库、SSL 证书全部挂载到宿主机,数据不丢失
明明 WordPress (Apache) 本身就能直接跑 80 端口网站,生产环境为什么一定要套一层 Nginx 反向代理? 先给结论: 《1》Apache 能直接对外暴露跑网站,但「只适合测试 / 本地开发」; 《2》生产公网上线,绝对不能直接把 Apache 裸奔暴露在公网,必须加 Nginx 前置。
生产必须加 Nginx 反向代理 6 大核心原因: 1. HTTPS / SSL 证书 极度难配置(致命痛点) Apache 配置 HTTPS: * 改 apache 配置、加载 ssl 模块、改虚拟主机、证书配置、重写跳转 * 配置繁琐、语法老旧、问题多、证书续配麻烦 Nginx 配置 HTTPS: * 配置极简、成熟通用、Certbot 一键自动续期 * 行业统一标准,运维人人都会 > 现实:99% 企业、网站、博客,都是 Nginx 统一承接 443/SSL,后端程序 (Apache/PHP-FPM/Node) 一律走内网 http。 2. 静态资源缓存 & 压缩,大幅提速 Apache 处理静态文件(图片 /css/js/ 字体)性能弱、消耗高。 Nginx 优势: * 专为静态文件高性能设计 * 可一键开启:浏览器缓存、gzip 压缩、过期策略 * 减轻 Apache + PHP 压力,CPU 负载大幅下降 * 访客打开网站更快,带宽更省 > 动态 PHP 请求 → 转给 Apache > 图片 / 样式 / 脚本 → Nginx 直接返回,不进 PHP *** ** * ** *** 3. 安全防护:隔离后端,隐藏真实服务 * 直接暴露 Apache: 外界可以扫描 Apache 版本、PHP 版本、爆破后台、扫描漏洞、直接攻击应用层。 * Nginx 前置代理: 后端 Apache 容器只在内部网桥网络,外网完全访问不到; 对外只暴露 Nginx,隐藏后端架构、版本、服务细节。 通俗理解: Nginx 是大门门卫,Apache 是屋里干活的人,外人不能直接进屋。 *** ** * ** *** 4. 负载均衡 & 多站点复用(后期扩展) 一台服务器多个网站: * 站点 A:WordPress (Apache) * 站点 B:Typora / 网盘 / 其他程序 * 站点 C:Java/Node 项目 只有 80/443 端口,靠 Nginx 虚拟主机 区分域名转发: * 域名 A → 转发给 wp 容器 * 域名 B → 转发给别的容器 如果裸奔 Apache:一台机器只能跑一个 web 服务,端口冲突无解。 *** ** * ** *** 5. 抗并发、防 DDOS、连接管理更强 * Apache 是进程 / 线程模型,高并发下内存占用爆炸、容易卡死 * Nginx 事件驱动模型,高并发、长连接、限流、防爬虫、防 CC 攻击 生产公网环境,流量波动大,Apache 扛不住公网裸奔流量。 *** ** * ** *** 6. 统一日志、限流、黑白名单、防火墙规则 所有公网访问统一经过 Nginx: * 统一日志审计 * 统一 IP 封禁、限流、防盗链 * 统一错误页面(404/503) 不用去改复杂的 Apache 配置。
两种架构对比: 架构 1:裸奔 Apache(开发 / 本地) 用户浏览器 → 公网IP:80 → 直接访问 Apache+WordPress 优点:简单、少一层 缺点:无 HTTPS、无缓存、不安全、性能差、无法多站、不易维护 *** ** * ** *** 架构 2:Nginx 反向代理(生产标准) 用户浏览器 → 公网 80/443 → Nginx(SSL/缓存/安全) ↓ 内网转发 内网网桥 → Apache WordPress(只处理动态PHP) 优点:安全、快、好维护、易扩容、标准生产架构
什么时候可以不用 Nginx? 满足全部条件才建议裸奔 Apache: 1. 仅本地访问 / 内网使用 2. 不需要 HTTPS 3. 单网站、无后续扩展 4. 不在乎安全、访问速度、并发 5. 纯个人测试玩玩
复制代码
#一键安装wordpress的compose目录结构
wordpress/
├── docker-compose.yml    # 新建这个一键安装wordpress的compose文件
├── php/                  # 新建目录
│   └── uploads.ini       # 新建文件(PHP配置)
├── nginx/                # 新建目录
│   ├── conf.d/           # 新建目录
│   │   └── default.conf  # 新建文件(Nginx 配置)
│   ├── ssl/              # 新建目录(放 HTTPS 证书,没有可以先空着)
│   └── log/              # 自动生成(Nginx 日志自动生成)
├── wp-data/              # 自动生成(WordPress 网站文件)
└── wpmysql-data/         # 自动生成(MySQL 数据库文件)

1.1、一键安装wordpress的compose脚本

bash 复制代码
#一键安装wordpress的compose脚本
mkdir -p /data/docker-compose/wordpress
cd /data/docker-compose/wordpress
vi docker-compose.yml

#【docker-compose.yml】文件的完整内容
version: '3.8'

# wordpress专用网络
networks:
  wp-network:
    driver: bridge

services:
  # MySQL 数据库(生产稳定配置)
  wp-mysql:
    image: mysql:8.0
    container_name: wp-db
    restart: always  # 生产必备:崩溃自动重启
    networks:
      - wp-network
    volumes:
      - ./wpmysql-data:/var/lib/mysql  # 数据库持久化
    environment:
      - MYSQL_ROOT_PASSWORD=ck@123456  # 必须修改!强密码
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wpuser
      - MYSQL_PASSWORD=admin@123456  # 必须修改!强密码
    command:  # 生产数据库优化
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
    healthcheck:  # 健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  # WordPress 主程序
  wordpress:
    image: wordpress:6.5-apache
    container_name: wp-web
    restart: always
    networks:
      - wp-network
    volumes:
      - ./wp-data:/var/www/html  # 网站文件持久化
      - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini  # PHP上传文件限制
    environment:
      - WORDPRESS_DB_HOST=wp-mysql:3306
      - WORDPRESS_DB_USER=wpuser
      - WORDPRESS_DB_PASSWORD=admin@123456  # 与上面数据库密码一致
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_TABLE_PREFIX=wp_  # 可自定义前缀增强安全
      - WORDPRESS_DEBUG=0  # 生产关闭调试模式
    depends_on:
      wp-mysql:
        condition: service_healthy

  # Nginx 反向代理(HTTPS、缓存、安全)
  nginx:
    image: nginx:stable-alpine
    container_name: wp-nginx
    restart: always
    networks:
      - wp-network
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d  # 配置文件
      - ./nginx/ssl:/etc/nginx/ssl        # SSL 证书
      - ./nginx/log:/var/log/nginx        # 日志持久化
      - ./wp-data:/var/www/html:ro        # 共享 WordPress 静态文件(只读,更安全)
    depends_on:
      - wordpress

1.2、创建php的目录及其配置

bash 复制代码
#创建php的目录与配置
cd /data/docker-compose/wordpress
mkdir php
cd php
vi uploads.ini

#【php/uploads.ini】文件的完整内容
#允许上传大文件(解决 WordPress 无法上传主题、插件、图片的问题)
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 180
memory_limit = 256M

1.3、创建nginx目录及其配置

bash 复制代码
#创建Nginx的目录及其配置
cd /data/docker-compose/wordpress
mkdir -p nginx/conf.d nginx/ssl nginx/log

#1-创建nginx的默认配置文件
vi nginx/conf.d/default.conf
#【nginx/conf.d/default.conf】文件的完整内容
server {
    listen 80;
    server_name _;  # 匹配所有域名(可将_替换为你自己的域名)

    root /var/www/html;
    index index.php index.html;

    # 处理静态文件(Nginx 直接返回,速度快)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|woff|ttf)$ {
        expires 30d;
        add_header Cache-Control public;
    }

    # 动态请求转发给 WordPress(Apache)
    location / {
        proxy_pass http://wordpress:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

注意:若要给网站配置为更安全的https加密,则需要使用如下配置:

bash 复制代码
#【nginx/conf.d/default.conf】文件的完整内容
server {
    listen 80;
    server_name 你的域名.com www.你的域名.com;

    # 让 Certbot 可以验证
    location /.well-known/acme-challenge/ {
        root /var/www/html;
        allow all;
    }

    # 其他全部跳 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name 你的域名.com www.你的域名.com;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    root /var/www/html;
    index index.php;

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
    }

    location / {
        proxy_pass http://wp-web:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}


#用Certbot免费申请证书
#前提条件:《1》你的域名已经解析到服务器IP;《2》服务器 80 端口已开放(你 docker-compose 已经映射 80:80)
cd /data/docker-compose/wordpress

docker run -it --rm \
  -v $(pwd)/nginx/ssl:/etc/letsencrypt \
  -v $(pwd)/wp-data:/var/www/html \
  -p 80:80 \
  certbot/certbot certonly --webroot \
  --webroot-path=/var/www/html \
  -d 你的域名.com \
  -d www.你的域名.com
#启动certbot容器后会有一个交互过程问你【邮箱:随便填】【同意协议:Y】【是否分享邮箱:N】跑完就成功拿到证书!
#证书自动放到 Nginx 能读取的目录(命令执行后,证书会自动生成在:【nginx/ssl/live/你的域名.com/】)
#把生成的证书复制到正确位置
cp nginx/ssl/live/你的域名.com/fullchain.pem nginx/ssl/
cp nginx/ssl/live/你的域名.com/privkey.pem nginx/ssl/
#重启 Nginx 生效 HTTPS
docker-compose restart nginx


#证书自动续期(90 天自动续)【可以加到 crontab 自动每月执行】
docker run -it --rm \
  -v $(pwd)/nginx/ssl:/etc/letsencrypt \
  -v $(pwd)/wp-data:/var/www/html \
  certbot/certbot renew

1.4、一键安装启动wordpress

bash 复制代码
#一键安装启动wordpress
cd /data/docker-compose/wordpress

#1-后台启动(生产标准方式)
docker-compose up -d

#2-查看运行状态
docker-compose ps

#3-查看日志(排查问题)
docker-compose logs -f

#在浏览器输入【IP】即可访问到wordpress

到这里,恭喜你使用一键部署wordpress应用完成。

二、使用docker-compose一键部署prometheus监控

搭建企业级运维监控平台的工具解析------及其Zabbix详解https://blog.csdn.net/xiaochenxihua/article/details/153245745

要编写部署prometheus的docker-compose脚本,必须了解prometheus监控平台每个组件的功能含义,以及组件之间的依赖关系。针对prometheus的各个组件镜像,不需要我们来制作,prometheus官网已经制作好了,可直接拿来使用。

复制代码
#prometheus配套的目录结构
prometheus-monitor/
├── docker-compose.yml       # 一键安装prometheus的配置文件
├── prometheus/
│   ├── prometheus.yml        # Prometheus 主配置
│   └── rules/                # 告警规则目录
│       └── host_rules.yml    # 主机监控告警规则
├── alertmanager/
│   └── alertmanager.yml      # 告警通知配置(邮件/钉钉/企业微信)
└── grafana/
    └── provisioning/         # 自动配置 Prometheus 数据源
        └── datasources/
            └── datasource.yml

2.1、一键安装prometheus的compose脚本

bash 复制代码
#prometheus的compose脚本
mkdir -p /data/docker-compose/prometheus-monitor
cd /data/docker-compose/prometheus-monitor
vi docker-compose.yml

#【docker-compose.yml】文件的完整内容
version: '3.8'

#prometheus的专用网络
networks:
  prom_net:
    driver: bridge

#数据卷持久化(存放路径是【/var/lib/docker/volumes/】)
volumes:
  prometheus_data:
  alertmanager_data:
  grafana_data:

services:
  #主机监控采集器(监控服务器的CPU、内存、磁盘、网络等信息)
  node-exporter:
    image: prom/node-exporter:v1.11.1    #固定版本,生产环境禁用latest
    container_name: node-exporter
    restart: always
    networks:
      - prom_net
    ports:
      - "9100:9100"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - --path.procfs=/host/proc
      - --path.sysfs=/host/sys
      - --path.rootfs=/rootfs
      - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)

  #prometheus主服务
  prometheus:
    image: prom/prometheus:v3.5.2    #固定版本,生产环境禁止用latest
    container_name: prometheus
    restart: always
    networks:
      - prom_net
    user: root  #解决宿主机挂载权限问题(生产安全方案)
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/rules:/etc/prometheus/rules  # 告警规则目录
      - prometheus_data:/prometheus  # 持久化时序数据
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      # 生产核心配置:数据保留 15 天,可根据磁盘调整
      - '--storage.tsdb.retention.time=15d'
      - '--web.enable-lifecycle'  # 支持热重载配置
      - '--storage.tsdb.min-block-duration=2h'
      - '--storage.tsdb.max-block-duration=2h'
    healthcheck:  # 健康检查
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9090/-/healthy"]
      interval: 30s
      timeout: 10s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G  # 生产推荐内存 2G~8G,根据监控规模调整
        reservations:
          cpus: '1'
          memory: 2G

  #告警管理器
  alertmanager:
    image: prom/alertmanager:v0.32.0
    container_name: alertmanager
    restart: always
    networks:
      - prom_net
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
      - '--web.listen-address=:9093'
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9093/-/healthy"]
      interval: 30s
      timeout: 10s
      retries: 3

  #可视化面板grafana
  grafana:
    image: grafana/grafana:11.6.13
    container_name: grafana
    restart: always
    networks:
      - prom_net
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning  #自动配置数据
    environment:
      - GF_SECURITY_ADMIN_USER=coffeemilk  # 生产务必修改默认账号
      - GF_SECURITY_ADMIN_PASSWORD=admin@123456  # 生产务必修改强密码
      - GF_USERS_ALLOW_SIGN_UP=false  # 关闭注册,生产安全
      - GF_SERVER_ROOT_URL=http://localhost:3000
      - GF_INSTALL_PLUGINS=grafana-piechart-panel  # 可选插件
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G

2.2、prometheus的核心配置

bash 复制代码
#prometheus的核心配套配置文件
cd /data/docker-compose/prometheus-monitor

#1-prometheus的核心配置文件
mkdir prometheus
vi prometheus.yml
#【prometheus/prometheus.yml】文件的完整内容
global:
  scrape_interval: 15s  # 采集间隔(生产推荐 15s~1m)
  evaluation_interval: 15s  # 告警规则评估间隔
  scrape_timeout: 10s

# 告警管理器配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093
# 加载告警规则
rule_files:
  - "rules/*.yml"
# 监控任务
scrape_configs:
  # 监控 Prometheus 自身
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
  # 监控服务器主机(node-exporter)
  - job_name: "node-exporter"
    static_configs:
      - targets: ["node-exporter:9100"]
        labels:
          app: "prometheus"
     
     
#2-生产常用主机告警(prometheus/rules/host_rules.yml)
mkdir rules
cd rules/
vi host_rules.yml
#【prometheus/rules/host_rules.yml】文件的完整内容
groups:
- name: host-alert
  rules:
  # CPU 使用率持续 5 分钟 > 80%
  - alert: HostHighCpuLoad
    expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "服务器 CPU 使用率过高"
      description: "CPU 使用率超过 80%,持续 5 分钟"

  # 内存使用率 > 85%
  - alert: HostHighMemoryUsage
    expr: 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) > 85
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "服务器内存使用率过高"

  # 磁盘使用率 > 85%
  - alert: HostDiskFull
    expr: 100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100) > 85
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "服务器磁盘空间不足"

2.3、告警通知配置

bash 复制代码
#告警通知(以钉钉为例;alertmanager/alertmanager.yml)
cd /data/docker-compose/prometheus-monitor
mkdir alertmanager
cd alertmanager/
vi alertmanager.yml

#【alertmanager/alertmanager.yml】文件的完整内容
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h  # 重复告警间隔
  receiver: 'dingtalk'

receivers:
- name: 'dingtalk'
  webhook_configs:
  - url: 'https://oapi.dingtalk.com/robot/send?access_token=你的钉钉机器人Token'
    send_resolved: true

inhibit_rules:
  - source_match:
      severity: critical
    target_match:
      severity: warning
    equal: ['alertname']

2.4、grafana自动关联prometheus配置

bash 复制代码
#grafana自动关联prometheus【grafana/provisioning/datasources/datasource.yml】
cd /data/docker-compose/prometheus-monitor
mkdir -p grafana/provisioning/datasources
cd grafana/provisioning/datasources
vi datasource.yml

#【grafana/provisioning/datasources/datasource.yml】文件的完整内容
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    url: http://prometheus:9090
    isDefault: true
    editable: false

2.5、一键安装启动prometheus

bash 复制代码
#一键安装启动prometheus
cd /data/docker-compose/prometheus-monitor

#1-后台一键启动prometheus所有服务
docker-compose up -d

#2-查看运行状态
docker-compose ps

#访问地址
Prometheus:http:// 服务器 IP:9090
Grafana:http:// 服务器 IP:3000(账号密码在 docker-compose.yml 中配置)
AlertManager:http:// 服务器 IP:9093


#热重载配置(修改 prometheus.yml 后无需重启)
curl -X POST http://localhost:9090/-/reload

到这里,恭喜你使用docker-compose一键部署prometheus监控平台就成功完成了。

关于prometheus的用法请移步查看《daodaPrometheus+Grafana构建云原生分布式监控系统(一)到(十八)》的博客体系学习掌握。

相关推荐
TG_yunshuguoji2 小时前
腾讯云代理商:腾讯云怎么一键部署Hermes?
人工智能·云计算·腾讯云·hermes agent·hermes
风口旁的猪2 小时前
一套可落地的 .NET 8 微服务/分布式工程实践
docker·consul·.net core·efcore·refit
搬砖魁首3 小时前
基础能力系列 - 如何安全养虾? - 容器化部署龙虾
docker·qwen·openclaw·龙虾
禅口魔心11 小时前
边缘网关开发计划(一):在 Rock 5T 上部署 Docker
物联网·docker·rk3588·边缘网关
huihuihuanhuan.xin11 小时前
记一次 Docker PostgreSQL 连接认证失败的排查与解决
docker
天籁晴空17 小时前
Docker Compose 部署完整指南 -- RuoYi-Vue
docker·ruoyi
@土豆17 小时前
Elasticsearch 9.0.1 集群部署(Docker Compose + k8s 部署方式)
大数据·elasticsearch·docker
Full Stack Developme20 小时前
可见字符 与 不可见字符
云计算
蛐蛐蛐21 小时前
在Windows 11上安装Docker的踩坑记录
运维·docker·容器