全部学科
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)实现负载均衡
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 Compose 网络与卷
下一篇 → Bridge 网络模式
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码