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微服务最佳实践
- 每个服务一个容器:遵循单一职责原则
- 使用自定义网络:隔离不同服务组
- 环境变量配置:不要硬编码配置
- 健康检查:确保服务可用性
- 数据持久化:使用命名数据卷
- 日志集中管理:便于排查问题
- 优雅关闭:处理 SIGTERM 信号
本章小结
Docker 和 Docker Compose 是构建微服务架构的理想工具。通过容器化每个服务,可以实现独立部署、灵活扩展和技术栈多样化。