Docker Compose 多容器编排:微服务本地联调环境搭建

核心组件说明
  • API服务:业务逻辑处理(假设使用 Python Flask)
  • MySQL:关系型数据库存储
  • Redis:缓存与会话管理

文件结构

project/
├── api/
│   ├── app.py
│   ├── requirements.txt
│   └── Dockerfile
└── docker-compose.yml


配置文件实现

1. Docker Compose 编排文件 (docker-compose.yml)
version: '3.8'

services:
  api:
    build: ./api
    container_name: api
    ports:
      - "5000:5000"
    environment:
      - MYSQL_HOST=mysql
      - MYSQL_USER=root
      - MYSQL_PASSWORD=rootpass
      - REDIS_HOST=redis
    depends_on:
      - mysql
      - redis
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: appdb
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - app-network

  redis:
    image: redis:6-alpine
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - app-network

volumes:
  mysql-data:

networks:
  app-network:
    driver: bridge

2. API 服务 Dockerfile (api/Dockerfile)
FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

EXPOSE 5000
CMD ["python", "app.py"]

3. Python 依赖文件 (api/requirements.txt)
Flask==2.0.2
redis==4.1.0
mysql-connector-python==8.0.26

4. Flask 应用示例 (api/app.py)
from flask import Flask
import mysql.connector
import redis

app = Flask(__name__)

# 从环境变量获取配置
mysql_host = os.environ.get('MYSQL_HOST')
mysql_user = os.environ.get('MYSQL_USER')
mysql_password = os.environ.get('MYSQL_PASSWORD')
redis_host = os.environ.get('REDIS_HOST')

@app.route('/')
def health_check():
    # 测试MySQL连接
    try:
        mysql_conn = mysql.connector.connect(
            host=mysql_host,
            user=mysql_user,
            password=mysql_password,
            database="appdb"
        )
        mysql_conn.close()
        mysql_status = "MySQL: ✔"
    except Exception as e:
        mysql_status = f"MySQL: ✘ ({str(e)})"

    # 测试Redis连接
    try:
        r = redis.Redis(host=redis_host, port=6379)
        r.ping()
        redis_status = "Redis: ✔"
    except Exception as e:
        redis_status = f"Redis: ✘ ({str(e)})"

    return f"<h3>微服务状态</h3><p>{mysql_status}<br>{redis_status}</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)


操作流程

  1. 启动服务

    docker-compose up --build
    

  2. 验证服务

    • 访问 http://localhost:5000 查看服务状态
    • MySQL 连接: mysql -h 127.0.0.1 -u root -p
    • Redis 连接: redis-cli -h 127.0.0.1
  3. 停止服务

    docker-compose down
    


关键特性说明

  1. 服务发现:容器间通过服务名互访(如 api 容器使用 mysql 主机名访问数据库)
  2. 数据持久化:MySQL 数据通过命名卷 mysql-data 持久存储
  3. 依赖管理
    • depends_on 确保启动顺序
    • 环境变量隔离敏感配置
  4. 网络隔离:自定义桥接网络确保容器间安全通信

通过此配置,可实现开发环境的快速重建和一致性保障,支持 API 服务的热重载(需在 Dockerfile 中添加代码监控逻辑)。

更多推荐