扩缩容与负载均衡
横向扩展服务副本可提升吞吐能力,下面介绍 Compose 扩缩容方法。
--scale 参数
Bash
# 启动时指定副本数
docker compose up -d --scale worker=3
# Compose 文件中配置
docker compose up -d
YAML
# docker-compose.yml
services:
worker:
build: ./worker
deploy:
replicas: 3
--scale运行时指定,deploy.replicas文件中配置。
多副本服务
YAML
version: '3.8'
services:
web:
image: my-web-app
deploy:
replicas: 3
environment:
- NODE_ENV=production
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
nginx.conf:
nginx
upstream backend {
server web:3000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
端口冲突处理
YAML
services:
app:
image: my-app
deploy:
replicas: 3
# 不能都映射到同一宿主机端口
# ports:
# - "3000:3000" # 冲突!
不暴露端口
YAML
services:
worker:
build: ./worker
deploy:
replicas: 3
# 不配置 ports,仅内部访问
随机端口
YAML
services:
web:
image: my-web
deploy:
replicas: 3
ports:
- "3000" # 随机宿主机端口
横向扩展 Worker
YAML
version: '3.8'
services:
redis:
image: redis:7
ports:
- "6379:6379"
worker:
build: ./worker
deploy:
replicas: 3
environment:
REDIS_URL: redis://redis:6379
# 多个 worker 连接同一 Redis
Bash
# 启动 3 个 worker
docker compose up -d --scale worker=3
# 动态调整
docker compose up -d --scale worker=5
无状态 vs 有状态
YAML
# 无状态服务可横向扩展
services:
api:
build: .
deploy:
replicas: 3
environment:
SESSION_STORE: redis://redis:6379 # 会话外置
# 有状态服务需要数据同步
services:
db:
image: postgres
# 不建议 scale,需要主从复制
无状态服务(API、Worker)适合横向扩展,有状态服务(DB)需要主从同步。
查看副本
Bash
# 查看所有副本
docker compose ps
# 输出示例
NAME IMAGE COMMAND STATUS
my-app-worker-1 my-app-worker "node worker.js" running
my-app-worker-2 my-app-worker "node worker.js" running
my-app-worker-3 my-app-worker "node worker.js" running
配合反向代理
YAML
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
api:
build: ./api
deploy:
replicas: 3
environment:
- PORT=3000
networks:
default:
nginx.conf:
nginx
upstream api_backend {
server api:3000;
}
server {
listen 80;
location /api {
proxy_pass http://api_backend;
}
}
要点总结
--scale参数指定服务副本数,deploy.replicas文件中配置- 无状态服务(API、Worker)适合横向扩展
- 有状态服务(DB)需要主从复制,不建议简单 scale
- 多副本不能映射同一宿主机端口,使用内部网络或随机端口
- 配合反向代理(Nginx)实现负载均衡
📝 发现内容有误?点击此处直接编辑