多服务编排实践

使用 Docker Compose 编排多服务应用的实践案例


📋 目录


Web 应用 + 数据库

基本配置

version: '3.8'
 
services:
  web:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
 
  db:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data
 
volumes:
  db-data:

启动服务

# 启动所有服务
docker-compose up -d
 
# 查看服务状态
docker-compose ps
 
# 查看日志
docker-compose logs -f

微服务架构编排

微服务配置

version: '3.8'
 
services:
  api-gateway:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - api
      - auth
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
 
  api:
    build: ./api
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
 
  auth:
    build: ./auth
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
    depends_on:
      - db
 
  db:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=password
    volumes:
      - db-data:/var/lib/postgresql/data
 
  redis:
    image: redis:latest
 
networks:
  default:
    name: microservices-network
 
volumes:
  db-data:

前后端分离项目

配置示例

version: '3.8'
 
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:80"
    depends_on:
      - backend
    environment:
      - API_URL=http://backend:8080
 
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
 
  db:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=password
    volumes:
      - db-data:/var/lib/postgresql/data
 
volumes:
  db-data:

服务依赖管理

depends_on

services:
  web:
    image: nginx:latest
    depends_on:
      - db
      - cache
 
  db:
    image: postgres:13
 
  cache:
    image: redis:latest

健康检查依赖

services:
  web:
    image: nginx:latest
    depends_on:
      db:
        condition: service_healthy
 
  db:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

服务扩展(scale)

扩展服务

# 扩展 web 服务到 3 个实例
docker-compose up -d --scale web=3
 
# 扩展多个服务
docker-compose up -d --scale web=3 --scale api=2

负载均衡配置

version: '3.8'
 
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - web
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
 
  web:
    build: .
    # 多个实例会自动负载均衡

完整实践案例

LAMP 栈

version: '3.8'
 
services:
  web:
    image: php:8.0-apache
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
    depends_on:
      - db
 
  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=mydb
    volumes:
      - db-data:/var/lib/mysql
 
volumes:
  db-data:

MEAN 栈

version: '3.8'
 
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:80"
    depends_on:
      - api
 
  api:
    build: ./api
    ports:
      - "8080:3000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=mongodb://db:27017/mydb
 
  db:
    image: mongo:5.0
    volumes:
      - db-data:/data/db
 
volumes:
  db-data:

📚 参考资源


相关笔记