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构建云原生分布式监控系统(一)到(十八)》的博客体系学习掌握。