不能用docker compose scale命令,应使用docker compose up --scale(运行时临时扩容)或deploy.replicas(配置文件固化副本数)实现单机横向扩展;前者灵活适用于压测与突发流量,后者适合生产环境长期生效,均无需swarm集群。

现在不能用 docker compose scale 命令了——这个命令早在 Compose v2.15+ 就被彻底移除,执行会直接报错 “unknown command”。真正可用、推荐的横向扩展方式只有两个:运行时用 docker compose up --scale,或配置中写死 deploy.replicas。两者都支持单机模式,不需要 Swarm 集群。
用 --scale 实现秒级临时扩容
这是最常用、最轻量的实战方法,适合压测、上线前验证、突发流量应对等场景。
- 语法简洁:docker compose up --scale
= ,比如启动 4 个 web 容器:docker compose up --scale web=4 -d-d - 支持一次扩多个服务,例如:docker compose up --scale web=3 --scale api=2 -d
- 它会自动停掉旧容器,新建指定数量的新实例,不影响其他未指定的服务
- 这次生效,下次再运行 docker compose up -d(不带 --scale),就会按 docker-compose.yml 里写的数量(或默认 1)重新拉起
在 docker-compose.yml 中固定副本数
适合生产环境或希望每次启动都保持稳定规模的场景,配置一次,长期生效。
- 在对应服务下添加 deploy 块:deploy:
replicas: 3 - 必须配合 docker compose up -d 使用(不是 --scale)
- 从 Compose v2.17+ 起,单机模式也原生支持该字段,CLI 内部自动调度多副本,无需额外配置
- 建议同步加资源限制,避免某个实例吃光 CPU 或内存:resources:
limits:
memory: 512M
cpus: '0.5'
验证和动态再调整
扩容后别忘了确认是否真的跑起来了。
- docker compose ps:列出所有容器,能看到 web-1、web-2 这类带序号的实例名
- docker compose ps web:只看 web 服务的所有副本
- docker compose ps --services:快速核对当前定义了哪些服务
- 想再调数量?直接执行新命令:docker compose up --scale web=6 -d,Compose 会自动替换旧副本,不用手动清理
必须避开的几个典型坑
很多失败不是命令不对,而是环境或设计没对齐。
- 如果服务用了 ports: ["80:80"] 这种宿主机端口映射,多个副本会端口冲突。解决办法是改用 expose + 反向代理(如 Nginx)做内部负载分发
- 有状态服务(PostgreSQL、Redis 单节点等)不要盲目扩 replicas,除非已实现主从、分片或外部协调机制
- 多个副本之间通过服务名 DNS 自动负载均衡(如应用里访问 http://api,请求会轮询落到 api-1、api-2…),但前提是它们都注册在同一网络下且无连接池硬编码











