Docker容器实践——Docker常用基础镜像的解析与选择https://coffeemilk.blog.csdn.net/article/details/160505593?spm1001.2014.3001.5502Docker容器实践——Docker-Compose实现多容器的控制https://coffeemilk.blog.csdn.net/article/details/160418801?spm1001.2014.3001.5502一、使用docker-compose一键部署wordpress应用在使用compose编写一个容器应用时需要了解应用的运行逻辑。本例中wordpress是一个博客系统基于PHP语言编写数据可以存储在MySQL中因此在部署这个应用之前至少需要构建mysql和wordpress 2个镜像wordpress镜像可以使用apachephp方式wordpress程序也可以放到wordpress这个镜像中而mysql可以独立构建一个镜像或者使用dockerhub官方给的mysql镜像也是可以的。#本文一键构建wordpress应用的生产环境架构说明 #采用 3 容器 数据持久化 架构 #1-WordPress (PHPApache)主程序 #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 直接返回不进 PHP3. 安全防护隔离后端隐藏真实服务直接暴露 Apache外界可以扫描 Apache 版本、PHP 版本、爆破后台、扫描漏洞、直接攻击应用层。Nginx 前置代理后端 Apache 容器只在内部网桥网络外网完全访问不到对外只暴露 Nginx隐藏后端架构、版本、服务细节。通俗理解Nginx 是大门门卫Apache 是屋里干活的人外人不能直接进屋。4. 负载均衡 多站点复用后期扩展一台服务器多个网站站点 AWordPress (Apache)站点 BTypora / 网盘 / 其他程序站点 CJava/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 → 直接访问 ApacheWordPress优点简单、少一层缺点无 HTTPS、无缓存、不安全、性能差、无法多站、不易维护架构 2Nginx 反向代理生产标准用户浏览器 → 公网 80/443 → NginxSSL/缓存/安全 ↓ 内网转发 内网网桥 → Apache WordPress只处理动态PHP优点安全、快、好维护、易扩容、标准生产架构什么时候可以不用 Nginx满足全部条件才建议裸奔 Apache仅本地访问 / 内网使用不需要 HTTPS单网站、无后续扩展不在乎安全、访问速度、并发纯个人测试玩玩#一键安装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脚本#一键安装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_PASSWORDck123456 # 必须修改强密码 - MYSQL_DATABASEwordpress - MYSQL_USERwpuser - MYSQL_PASSWORDadmin123456 # 必须修改强密码 command: # 生产数据库优化 --default-authentication-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_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_HOSTwp-mysql:3306 - WORDPRESS_DB_USERwpuser - WORDPRESS_DB_PASSWORDadmin123456 # 与上面数据库密码一致 - WORDPRESS_DB_NAMEwordpress - WORDPRESS_TABLE_PREFIXwp_ # 可自定义前缀增强安全 - WORDPRESS_DEBUG0 # 生产关闭调试模式 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: - wordpress1.2、创建php的目录及其配置#创建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 256M1.3、创建nginx目录及其配置#创建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加密则需要使用如下配置#【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-age2592000; } 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 renew1.4、一键安装启动wordpress#一键安装启动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.yml2.1、一键安装prometheus的compose脚本#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.time15d - --web.enable-lifecycle # 支持热重载配置 - --storage.tsdb.min-block-duration2h - --storage.tsdb.max-block-duration2h healthcheck: # 健康检查 test: [CMD, wget, --quiet, --tries1, --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, --tries1, --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_USERcoffeemilk # 生产务必修改默认账号 - GF_SECURITY_ADMIN_PASSWORDadmin123456 # 生产务必修改强密码 - GF_USERS_ALLOW_SIGN_UPfalse # 关闭注册生产安全 - GF_SERVER_ROOT_URLhttp://localhost:3000 - GF_INSTALL_PLUGINSgrafana-piechart-panel # 可选插件 healthcheck: test: [CMD, wget, --quiet, --tries1, --spider, http://localhost:3000/api/health] interval: 30s timeout: 10s retries: 3 deploy: resources: limits: cpus: 1 memory: 2G2.2、prometheus的核心配置#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{modeidle}[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、告警通知配置#告警通知以钉钉为例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配置#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: false2.5、一键安装启动prometheus#一键安装启动prometheus cd /data/docker-compose/prometheus-monitor #1-后台一键启动prometheus所有服务 docker-compose up -d #2-查看运行状态 docker-compose ps #访问地址 Prometheushttp:// 服务器 IP:9090 Grafanahttp:// 服务器 IP:3000账号密码在 docker-compose.yml 中配置 AlertManagerhttp:// 服务器 IP:9093 #热重载配置修改 prometheus.yml 后无需重启 curl -X POST http://localhost:9090/-/reload到这里恭喜你使用docker-compose一键部署prometheus监控平台就成功完成了。关于prometheus的用法请移步查看《daodaPrometheusGrafana构建云原生分布式监控系统一到十八》的博客体系学习掌握。