Docker容器化高可用架构部署方案

00-总览README

Docker容器化部署方案 - 3节点高可用集群

项目概述

本项目部署一套基于Docker容器化的高可用Web服务集群,包含3个节点,共运行21个容器,涵盖负载均衡、PHP服务、Redis缓存集群、Redis Sentinel哨兵和MySQL MGR数据库集群。

架构特点

  • 3节点部署:Node1(Node1)、Node2(Node2)、Node3(Node3)

  • VIP高可用:通过Keepalived实现虚拟IP(172.20.1.100)漂移

  • 7服务冗余:每台主机都运行nginx-lb、keepalived、php、php-fpm、redis、sentinel、mysql

  • 5网络隔离:frontend-net、backend-net、cache-net、database-net、manage-net

  • 容器总数:21个(每节点7个)

三台VM信息

主机名 IP地址 角色 容器数量
Node1 192.168.64.128 Master 7
Node2 192.168.64.129 Backup1 7
Node3 192.168.64.130 Backup2 7(含backup-server)

整体拓扑图

复制代码
┌─────────────────────────────────────────────────────────────────────────────┐
│                              客户端访问                                       │
│                                  │                                          │
│                                  ▼                                          │
│                         ┌─────────────────┐                                 │
│                         │  VIP: 172.20.1.100   │  ← Keepalived浮动IP         │
│                         └────────┬────────┘                                 │
│                    ┌─────────────┼─────────────┐                            │
│                    ▼             ▼             ▼                            │
│             ┌───────────┐  ┌───────────┐  ┌───────────┐                     │
│             │Nginx-LB   │  │Nginx-LB   │  │Nginx-LB   │                     │
│             │172.20.1.11│  │172.20.1.12│  │172.20.1.13│                     │
│             │ Master    │  │ Backup    │  │ Backup    │                     │
│             └────┬──────┘  └─────┬─────┘  └─────┬─────┘                     │
└──────────────────│───────────────│──────────────│───────────────────────────┘
                   │               │              │
                   ▼               ▼              ▼
          ┌────────────────────────────────────────────────┐
          │              backend-net (172.20.2.0/24)       │
          │  ┌───────────┐ ┌───────────┐ ┌───────────┐     │
          │  │ PHP(nginx)│ │ PHP(nginx)│ │ PHP(nginx)│     │
          │  │172.20.2.11│ │172.20.2.12│ │172.20.2.13│     │
          │  └────┬──────┘ └─────┬─────┘ └─────┬─────┘     │
          │  ┌─────┴─────┐ ┌──────┴────┐ ┌──────┴────┐     │
          │  │PHP-FPM    │ │PHP-FPM    │ │PHP-FPM    │     │
          │  │172.20.2.21│ │172.20.2.22│ │172.20.2.23│     │
          │  └───────────┘ └───────────┘ └───────────┘     │
          └────────────────────────────────────────────────┘
                   │             │             │
                   ▼             ▼             ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│              cache-net (172.20.3.0/24)    │   database-net (172.20.4.0/24)  │
│                                           │                                 │
│   ┌─── Redis集群 ───┐  ┌─ Sentinel集群 ───┐ │ ┌─────────────────┐             │
│   │ Redis Master    │  │ Sentinel-01    │ │ │ MySQL Node1     │             │
│   │ 172.20.3.11(M)  │  │ 172.20.3.31    │ │ │ 172.20.4.11(P)  │             │
│   └────────┬────────┘  └───────┬────────┘ │ └────────┬────────┘             │
│            │  ←主从复制→         │ ↑监控    │          │ ←集群复制→             │
│   ┌────────┴────────┐  ┌───────┴───────┐  │ ┌────────┴────────┐             │
│   │ Redis Slave     │  │ Sentinel-02   │  │ │ MySQL Node2     │             │
│   │ 172.20.3.12(S)  │  │ 172.20.3.32   │  │ │ 172.20.4.12(S)  │             │
│   └────────┬────────┘  └──────┬────────┘  │ └────────┬────────┘             │
│            │                  │           │          │                      │
│   ┌────────┴────────┐  ┌──────┴────────┐  │ ┌────────┴────────┐             │
│   │ Redis Slave     │  │ Sentinel-03   │  │ │ MySQL Node3     │             │
│   │ 172.20.3.13(S)  │  │ 172.20.3.33   │  │ │ 172.20.4.13(S)  │             │
│   └─────────────────┘  └───────────────┘  │ └─────────────────┘             │
│                                            │                                │
└─────────────────────────────────────────────────────────────────────────────┘
​
┌─────────────────────────────────────────────────────────────────────────────┐
│                     manage-net (172.20.5.0/24)                              │
│  ┌─────────────────────────────────────┐                                    │
│  │ Backup Server (Node3上)             │                                    │
│  │ 172.20.5.13                         │                                    │
│  └─────────────────────────────────────┘                                    │
└─────────────────────────────────────────────────────────────────────────────┘

IP规划表

服务IP分配

节点 nginx-lb keepalived php php-fpm redis sentinel mysql
Node1 172.20.1.11 Master(p100) 172.20.2.11 172.20.2.21 172.20.3.11(M) 172.20.3.31 172.20.4.11
Node2 172.20.1.12 Backup(p90) 172.20.2.12 172.20.2.22 172.20.3.12(S) 172.20.3.32 172.20.4.12
Node3 172.20.1.13 Backup(p80) 172.20.2.13 172.20.2.23 172.20.3.13(S) 172.20.3.33 172.20.4.13

网络规划

网络名称 子网 网关 用途
frontend-net 172.20.1.0/24 172.20.1.1 Nginx-LB、Keepalived VIP
backend-net 172.20.2.0/24 172.20.2.1 PHP服务、PHP-FPM
cache-net 172.20.3.0/24 172.20.3.1 Redis、Sentinel
database-net 172.20.4.0/24 172.20.4.1 MySQL MGR
manage-net 172.20.5.0/24 172.20.5.1 备份服务(仅Node3)

技术组件说明

Nginx-LB (负载均衡器)

  • 镜像:nginx:alpine

  • 作用:接收客户端请求,负载分发到后端PHP服务

  • 配置:upstream指向3个PHP服务的IP

Keepalived (高可用)

  • 镜像:ednxzu/keepalived:2.3.4

  • 作用:实现VIP漂移,保证服务高可用

  • VRRP协议,3节点各有不同优先级

PHP服务 (双容器架构)

  • PHP容器:nginx:alpine (静态文件服务)

  • PHP-FPM容器:php:8.2-fpm-alpine (动态PHP处理)

  • 通信:fastcgi_pass通过外部IP转发

Redis集群

  • 主节点:172.20.3.11 (Master)

  • 从节点:172.20.3.12、172.20.3.13 (Slave)

  • 哨兵:3个Sentinel监控主节点状态

Sentinel (哨兵)

  • 镜像:redis:7-alpine

  • 作用:Redis自动故障转移

  • 监控mymaster主节点,2票生效

MySQL MGR (组复制集群)

  • 单主模式,Node1为Primary

  • 3节点通过33061端口通信

  • GTID事务复制

文件清单

复制代码
Docker容器化部署方案/
├── docker-compose-node1.yml      # Node1服务编排
├── docker-compose-node2.yml      # Node2服务编排
├── docker-compose-node3.yml      # Node3服务编排
├── config/
│   ├── nginx-lb/
│   │   ├── nginx.conf            # Nginx主配置
│   │   ├── conf.d/upstream.conf   # upstream配置
│   │   └── ssl.conf              # SSL配置
│   ├── keepalived/
│   │   ├── keepalived_master.conf # Master配置
│   │   ├── keepalived_backup.conf # Backup1配置
│   │   ├── keepalived_backup2.conf # Backup2配置
│   │   ├── check_nginx.sh        # Nginx检查脚本
│   │   └── notify.sh             # 状态通知脚本
│   ├── php/
│   │   ├── php-node1.conf        # Node1 PHP配置
│   │   ├── php-node2.conf        # Node2 PHP配置
│   │   ├── php-node3.conf        # Node3 PHP配置
│   │   └── php.ini               # PHP运行时配置
│   ├── redis/
│   │   ├── redis-master.conf     # Redis主配置
│   │   ├── redis-slave.conf      # Redis从配置
│   │   └── sentinel.conf         # 哨兵配置
│   └── mysql/
│       ├── my-node1.cnf          # Node1 MySQL配置
│       ├── my-node2.cnf          # Node2 MySQL配置
│       ├── my-node3.cnf          # Node3 MySQL配置
│       └── init.sql              # 初始化SQL
├── scripts/
│   └── backup.sh                 # 备份脚本
├── 00-总览README.md
├── 01-环境准备.md
├── 02-网络创建.md
├── 03-目录创建.md
├── 04-创建配置文件.md
├── 05-Nginx-LB配置详解.md
├── 06-Keepalived配置详解.md
├── 07-PHP服务配置详解.md
├── 08-Redis配置详解.md
├── 09-Sentinel配置详解.md
├── 10-MySQL配置详解.md
├── 11-MySQL-MGR初始化.md
├── 12-验证测试.md
├── 13-快速部署.md
├── 14-运维手册.md
└── 答辩演讲稿.md

快速开始步骤

1. 环境准备

复制代码
# 在所有节点执行
curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker
docker compose version

2. 创建网络

复制代码
# 在所有节点执行
docker network create -d macvlan --subnet=172.20.1.0/24 --gateway=172.20.1.1 -o parent=ens33 frontend-net
docker network create -d macvlan --subnet=172.20.2.0/24 --gateway=172.20.2.1 -o parent=ens33 backend-net
docker network create -d macvlan --subnet=172.20.3.0/24 --gateway=172.20.3.1 -o parent=ens33 cache-net
docker network create -d macvlan --subnet=172.20.4.0/24 --gateway=172.20.4.1 -o parent=ens33 database-net
docker network create -d macvlan --subnet=172.20.5.0/24 --gateway=172.20.5.1 -o parent=ens33 manage-net

3. 创建目录

复制代码
mkdir -p /opt/cluster-deploy/{config/{nginx-lb/{conf.d},keepalived,php,redis,mysql},scripts}

4. 部署服务

复制代码
# Node1
docker compose -f docker-compose-node1.yml up -d
​
# Node2
docker compose -f docker-compose-node2.yml up -d
​
# Node3
docker compose -f docker-compose-node3.yml up -d

5. 初始化MySQL MGR

复制代码
# 在Node1 MySQL中执行
docker exec -it mysql-01 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1

详见 13-快速部署.md

关键修复记录(13个排错经验)

1. Docker Compose V5兼容

  • 问题:旧版本语法不兼容

  • 修复 :删除version行,使用docker compose(空格)而非docker-compose(连字符)

2. Keepalived hostname冲突

  • 问题 :network_mode: service:xxx时不能设置hostname

  • 修复:删除hostname配置或使用network_mode: host

3. 配置文件挂载变目录

  • 问题:挂载的配置文件不存在时,Docker会创建目录导致启动失败

  • 修复 :必须先创建所有配置文件,再执行docker compose up

4. MySQL socket路径

  • 问题:容器内socket连接可能失败

  • 修复 :使用-h 127.0.0.1强制TCP连接

5. MySQL GTID未开启

  • 问题:MGR要求GTID模式

  • 修复 :gtid_mode=ON 和 enforce_gtid_consistency=ON

6. 配置写入错误段

  • 问题:配置写入错误的段导致不生效

  • 修复 :MGR参数必须写在[mysqld]段,不是[mysql]段;使用cat >覆盖写法

7. MGR恢复通道DNS

  • 问题:Macvlan网络无DNS解析

  • 修复 :report_host=IP使用IP地址

8. caching_sha2_password兼容

  • 问题:MGR复制用户不支持新认证插件

  • 修复 :创建复制用户时使用mysql_native_password

9. osixia/keepalived模板覆盖

  • 问题:镜像环境变量会覆盖自定义配置

  • 修复:自定义entrypoint绕过模板系统

10. Redis 7.x兼容

  • 问题:旧配置项在新版本中已废弃

  • 修复 :删除active-rehashing配置

11. Redis日志权限

  • 问题:非root用户无法写日志文件

  • 修复 :logfile ""输出到stdout

12. Sentinel配置只读

  • 问题:Sentinel需要写入状态

  • 修复 :不能挂载为:ro

13. MySQL healthcheck

  • 问题 :mysqladmin不支持--no-auth-warning参数

  • 修复:从healthcheck命令中删除该参数

相关推荐
I'mChloe2 小时前
Windows部署BiliNote:Docker安装、AI视频转写、Markdown笔记与cpolar远程访问
人工智能·windows·docker
梦帮科技3 小时前
LoRA / QLoRA 低秩矩阵流形更新:SVD 分解、秩与缩放因子 α 的物理意义与梯度稳定性保障
网络·深度学习·神经网络·线性代数·矩阵·架构·数据挖掘
打工仔折腾 AI3 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
天远数科4 小时前
零信任架构实战:基于天远运营商三要素简版V即时版查询构建自动化买手实名核验网关
运维·人工智能·架构·自动化
天衍四九-4 小时前
Docker Compose企业实战系列(八·终章):多环境隔离实战,开发/测试/生产一键切换
运维·docker·容器
光依旧4 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
阿拉斯攀登4 小时前
从需求文档到方案-无人售货机纯视觉与免密支付
架构
阿拉斯攀登4 小时前
双门两路锁四摄-售货机硬件形态的软件建模
架构
abigalexy5 小时前
图解AI应用架构设计
人工智能·ai·架构·系统架构·aigc
龙亘川5 小时前
智慧交通运输监管平台业务建模与架构解析
人工智能·架构·智慧城市·数据可视化·政务