扩容机制说明
Compose 可以把一个服务扩成多个副本:up --scale 服务=N 做临时扩容,文件里的 deploy.replicas 固化副本数。扩容的前提是服务无状态、不绑定固定宿主端口、也不指定固定容器名,否则第二个副本会因为端口占用或名称冲突起不来。缩容时多余的容器会被直接删除。
基本信息
| 临时扩容 | docker compose up -d --scale web=3 |
|---|---|
| 固化副本数 | deploy.replicas: 3 |
| 冲突项 | container_name 与固定 ports 映射 |
| 适用范围 | 无状态服务 |
| 查看方式 | docker compose ps 列出各副本 |
典型使用场景
- 提升无状态服务的并发处理能力
- 发布前临时扩容、发布后缩回原副本数
- 本地验证多副本下的负载均衡行为
- 压测时快速增加副本观察瓶颈
- 缩容以释放宿主资源
文件中的副本数
文件中的副本数
services:
web:
image: app/web:1.4.2
deploy:
replicas: 3 # 固化副本数
# 注意:不要写 container_name,否则无法扩容
# 也不要使用固定的宿主端口映射,否则副本会端口冲突扩容与缩容
扩容与缩容
docker compose up -d --scale web=3 # 临时扩到 3 个副本
docker compose ps --format 'table {{.Name}} {{.Service}} {{.Status}}'
docker compose up -d --scale web=1 # 缩回单副本
docker compose logs --tail=20 web # 查看该服务所有副本的日志扩容方式对比
| 方式 | 写法 | 特点 |
|---|---|---|
| 临时扩容 | up -d --scale web=3 | 不改文件,重新 up 会回到文件定义 |
| 固化副本 | deploy.replicas: 3 | 每次 up 都按该值收敛 |
| 冲突项 | container_name 与固定端口 | 存在时扩容直接失败 |
| 缩容 | 把数值调小 | 多余容器被直接删除 |
多副本只在服务无状态时才有效;会话共享、定时任务这类进程要考虑任务被重复执行的问题。
缩容会直接删除多余容器,容器内未持久化的数据一并消失,需要保留的内容应放在卷或外部存储中。
扩容前检查
- 服务是否无状态,会话与本地缓存是否可丢弃
- 是否使用了固定宿主端口映射,需要改为不发布端口
- 是否设置了固定容器名,需要移除才能扩容
- 扩容目标数是否与宿主资源匹配,避免副本互相抢占