docker compose 可通过独立网络与隔离卷、服务前缀与标签化、资源硬限与cgroups v2、参数化模板与生命周期脚本实现轻量多租户隔离。

Docker Compose 本身不内置“多租户”概念,但可通过组合网络、存储、服务命名与资源配置等机制,实现轻量、可控、开箱即用的多租户环境隔离。关键不在加功能,而在做减法——让每个租户只看到、只能访问自己那一套资源。
独立网络 + 隔离卷:租户间物理级断连
每个租户对应一个专属网络和数据卷,从底层切断通信与文件共享可能:
- 为租户 A 定义 tenant-a-net(bridge 类型),所有该租户服务(如
tenant-a-api、tenant-a-db)只接入此网络;其他租户的服务无法加入,也无法通过 DNS 或 IP 访问 - 挂载专用命名卷,例如
tenant-a-data:/app/data,不复用或共享 volume 名称;避免因路径重叠导致配置/日志/上传文件被误读 - 禁用默认桥接网络(
network_mode: "default"不启用),显式声明networks:列表,杜绝隐式互通
服务前缀 + 标签化管理:逻辑可识别、可操作
靠命名和元数据区分租户,便于脚本批量控制和可观测性归类:
- 所有服务名带租户标识,如
tenant-b-web、tenant-b-redis;配合docker compose --project-name tenant-b up启动,项目名即租户 ID - 在 service 下添加
labels:,例如tenant.id: "tenant-c"、env.role: "sandbox",供监控、日志采集(Loki)、清理脚本按标签筛选 - 避免跨租户服务发现:不共用 Consul 或 etcd;若需轻量服务寻址,可用 dnsmasq 容器 + 按租户生成 hosts 映射
资源硬限 + cgroups v2 约束:防争抢、保公平
防止某租户突发负载拖垮整台宿主机,用 Compose 原生配额能力设边界:
- 在每个租户 service 下配置
deploy.resources.limits:memory: "1G"(超限触发 OOM kill)cpus: "2.0"(CPU 时间片上限,非物理核数) - 宿主机必须启用 cgroups v2(启动参数含
systemd.unified_cgroup_hierarchy=1),Docker daemon 需以--cgroup-manager=systemd运行 - 搭配
reservations设置最低保障,例如memory: "256M",确保基础响应不卡顿
参数化模板 + 生命周期脚本:租户自助、运维可控
把重复操作封装成可复用、可审计的动作,避免人工改配置出错:
- 用
.env文件定义TENANT_ID=staging-03,compose 文件中引用${TENANT_ID}替换网络名、卷名、镜像 tag - 配套
up.sh脚本:自动校验变量、生成租户密钥、注入 TLS 证书路径、调用docker compose --project-name ${TENANT_ID} up -d - 提供
teardown.sh:按 project-name 清理容器、网络、卷,并记录操作时间戳到日志;防止沙箱堆积失控











