全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 6 分钟 ✍️ juanwangdev

扩缩容与负载均衡

横向扩展服务副本可提升吞吐能力,下面介绍 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)实现负载均衡

📝 发现内容有误?点击此处直接编辑

← 上一篇 多容器编排启动
下一篇 → 服务依赖与健康检查
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库