1. 多租户概念与隔离需求

1.1 什么是多租户

多租户(Multi-Tenancy)是一种软件架构模式,指同一套系统实例同时服务于多个独立用户群体(租户),每个租户在逻辑上彼此隔离,互不感知。在云原生场景下,租户可以是一个团队、一个项目、一个客户部门或一个微服务环境。

核心特征: 共享基础设施 + 逻辑隔离 + 资源配额独立 + 数据访问隔离

多租户与单租户的核心区别在于资源复用程度与隔离粒度:

对比维度 单租户架构 多租户架构
实例数量 每个租户独立部署一套 所有租户共享一套或有限套
资源利用率 低,存在大量空闲 高,通过复用降低总成本
运维复杂度 随租户数量线性增长 集中管理,增长较缓
隔离强度 物理/虚拟机级强隔离 逻辑/容器级隔离,需精心设计
适用场景 金融、合规要求极高的场景 SaaS、DevOps 平台、测试环境

1.2 租户隔离的三大维度

在 Docker Compose 多租户栈中,隔离必须覆盖以下三个核心维度,缺一不可:

1.2.1 网络隔离

每个租户拥有独立的网络命名空间,包括独立的 IP 段、DNS 解析、端口空间和网络策略。租户 A 的服务不能直接访问租户 B 的数据库,除非通过显式网关或服务网格。

  • 实现方式: Docker Compose 的 network 隔离 + 自定义子网
  • 关键指标: 租户间网络延迟 ≤ 1ms(同宿主机),吞吐量 ≥ 1Gbps
  • 常见陷阱: 默认 bridge 网络不隔离端口,需使用 --internal 或 overlay 网络

1.2.2 数据隔离

每个租户的数据存储(数据库、缓存、对象存储)在逻辑或物理上完全分离。一个租户的 SQL 注入或数据泄露不应影响其他租户。

  • 实现方式: 独立数据库实例 / 独立 Schema / 行级隔离 + 加密密钥分离
  • 关键指标: 数据恢复时间目标(RTO)≤ 15 分钟,恢复点目标(RPO)≤ 5 分钟
  • 常见陷阱: 共享数据库时忘记设置 schema_per_tenant 或行级过滤策略

1.2.3 资源隔离

每个租户的计算资源(CPU、内存、磁盘 IO、网络带宽)受到配额限制,防止“吵闹邻居”效应导致服务质量下降。

  • 实现方式: Docker Compose 的 deploy.resources + cgroup 限制
  • 关键指标: CPU 超分比 ≤ 4:1,内存超分比 ≤ 1.5:1
  • 常见陷阱: 只配 CPU 不配内存,导致 OOM Killer 误杀邻居租户进程
多租户隔离三大维度 租户 A App 容器组 CPU: 2核 / 内存: 4G DB 容器 独立 Schema Redis 缓存 独立实例 网络: 10.10.1.0/24 独立网卡 租户 B App 容器组 CPU: 4核 / 内存: 8G DB 容器 独立 Schema Redis 缓存 独立实例 网络: 10.10.2.0/24 独立网卡 网络隔离 数据隔离 资源隔离 共享基础设施 Docker 宿主机 存储卷池 DNS / 日志 监控 / 告警
实践建议: 在 Docker Compose 中,网络隔离通过 networks 定义独立子网实现;数据隔离推荐每个租户一个独立数据库容器;资源隔离使用 deploy.resources.limits 和 reservations 配合 cgroup 驱动。

1.3 为什么选择 Docker Compose 作为编排工具

在 Kubernetes 成为容器编排事实标准的今天,选择 Docker Compose 作为多租户隔离栈的编排工具,是基于以下特定场景的理性决策:

评估维度 Docker Compose Kubernetes 选择理由(本课程)
学习曲线 低,1-2 天可上手 高,通常 2-4 周 团队快速交付,降低入门门槛
资源开销 单机,无额外控制面 至少 3 节点 + etcd 开发/测试环境成本敏感
隔离粒度 进程级 + 网络命名空间 Pod 级 + NetworkPolicy Compose 足够满足逻辑隔离需求
启动速度 秒级(docker compose up -d) 分钟级(含调度与拉取) CI/CD 流水线需要快速环境拉起
配置复杂度 单个 YAML 文件 多个 CRD + Helm Chart 减少运维心智负担
生态成熟度 适合 10-50 个租户规模 适合 100+ 租户大规模集群 中小规模场景更务实
适用边界: 当租户数量超过 50 个,或需要跨主机自动调度、滚动升级、自动扩缩容时,应迁移至 Kubernetes。Docker Compose 多租户栈的最佳场景是 中小规模(5-50 租户)的 DevOps 测试环境、SaaS 预览环境、内部工具平台。

Docker Compose 在多租户隔离栈中的独特优势体现在:

  • 声明式租户定义: 每个租户对应一个 docker-compose.yml 文件,通过 project_name 和 network 前缀实现命名空间隔离
  • 资源配额原生支持: Docker Compose v2 直接支持 deploy.resources,无需额外安装插件
  • 快速克隆与销毁: 租户环境创建/删除仅需一条命令,适合 CI/CD 动态分配
  • 与 Docker 生态无缝集成: 可直接复用 Dockerfile、Volume、Secret 等原生能力
Docker Compose 多租户编排流程 1. 定义租户模板 docker-compose.yml + .env 变量 2. 注入租户标识 TENANT_ID NETWORK_SUBNET 3. 启动租户栈 docker compose -p tenant-{id} up 4. 隔离验证 网络连通性测试 资源配额检查 典型租户启动命令示例 # 为租户 "alpha" 创建隔离栈 TENANT_ID=alpha NETWORK_SUBNET=10.10.1.0/24 docker compose -p tenant-alpha up -d # 验证隔离:租户 alpha 无法访问租户 beta 的数据库端口
本课程定位: 我们将基于 Docker Compose 构建一套完整的多租户隔离栈,涵盖网络隔离、数据隔离、资源配额、监控告警、日志聚合和自动化运维。适合 5-50 个租户的中小规模场景,兼顾开发效率与生产稳定性。