Skip to content

Docker 微服务

本章将介绍如何使用 Docker 构建和部署微服务架构应用。

微服务架构概述

微服务架构将应用拆分为多个独立的小服务,每个服务:

  • 独立开发和部署
  • 拥有自己的数据存储
  • 通过 API 进行通信
  • 可以使用不同的技术栈
┌─────────────────────────────────────────────────┐
│                   API Gateway                    │
│                  (Nginx/Traefik)                 │
└──────┬──────────────┬──────────────┬────────────┘
       │              │              │
┌──────▼─────┐ ┌──────▼─────┐ ┌─────▼──────┐
│ 用户服务   │ │ 订单服务   │ │ 商品服务   │
│ (Node.js)  │ │ (Python)   │ │ (Go)       │
└──────┬─────┘ └──────┬─────┘ └─────┬──────┘
       │              │              │
┌──────▼─────┐ ┌──────▼─────┐ ┌─────▼──────┐
│ PostgreSQL │ │   MySQL    │ │  MongoDB   │
└────────────┘ └────────────┘ └────────────┘

Docker Compose 实现微服务

项目结构

microservices/
├── docker-compose.yml
├── gateway/
│   └── nginx.conf
├── user-service/
│   ├── Dockerfile
│   └── ...
├── order-service/
│   ├── Dockerfile
│   └── ...
└── product-service/
    ├── Dockerfile
    └── ...

docker-compose.yml

yaml
services:
  # API 网关
  gateway:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./gateway/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - user-service
      - order-service
      - product-service

  # 用户服务
  user-service:
    build: ./user-service
    environment:
      - DB_HOST=user-db
      - DB_PORT=5432
    depends_on:
      - user-db

  user-db:
    image: postgres:16
    environment:
      POSTGRES_DB: users
      POSTGRES_PASSWORD: secret
    volumes:
      - user-db-data:/var/lib/postgresql/data

  # 订单服务
  order-service:
    build: ./order-service
    environment:
      - DB_HOST=order-db
      - DB_PORT=3306
    depends_on:
      - order-db

  order-db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: orders
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - order-db-data:/var/lib/mysql

  # 商品服务
  product-service:
    build: ./product-service
    environment:
      - DB_HOST=product-db
      - DB_PORT=27017
    depends_on:
      - product-db

  product-db:
    image: mongo:7
    volumes:
      - product-db-data:/data/db

  # 缓存
  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  user-db-data:
  order-db-data:
  product-db-data:
  redis-data:

API 网关配置

nginx
upstream user-service {
    server user-service:3000;
}

upstream order-service {
    server order-service:8000;
}

upstream product-service {
    server product-service:8080;
}

server {
    listen 80;

    location /api/users {
        proxy_pass http://user-service;
    }

    location /api/orders {
        proxy_pass http://order-service;
    }

    location /api/products {
        proxy_pass http://product-service;
    }
}

服务间通信

HTTP/REST 通信

服务之间通过 HTTP API 调用:

python
# order-service 调用 user-service
import requests

def get_user(user_id):
    response = requests.get(f"http://user-service:3000/api/users/{user_id}")
    return response.json()

消息队列通信

使用 RabbitMQ 或 Redis 实现异步通信:

yaml
# 在 docker-compose.yml 中添加
  rabbitmq:
    image: rabbitmq:3-management
    ports:
      - "5672:5672"
      - "15672:15672"

服务扩展

bash
# 扩展订单服务到 3 个实例
docker compose up -d --scale order-service=3

配合 Nginx 负载均衡:

nginx
upstream order-service {
    server order-service:8000;
    # Docker Compose 会自动负载均衡到多个实例
}

健康检查

yaml
services:
  user-service:
    build: ./user-service
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

日志管理

集中式日志

yaml
services:
  app:
    image: myapp
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

查看服务日志

bash
# 查看所有服务日志
docker compose logs

# 查看指定服务日志
docker compose logs user-service

# 实时跟踪
docker compose logs -f order-service

微服务最佳实践

  1. 每个服务一个容器:遵循单一职责原则
  2. 使用自定义网络:隔离不同服务组
  3. 环境变量配置:不要硬编码配置
  4. 健康检查:确保服务可用性
  5. 数据持久化:使用命名数据卷
  6. 日志集中管理:便于排查问题
  7. 优雅关闭:处理 SIGTERM 信号

本章小结

Docker 和 Docker Compose 是构建微服务架构的理想工具。通过容器化每个服务,可以实现独立部署、灵活扩展和技术栈多样化。

延伸阅读