正在加载,请稍候…

Docker Compose 开发环境:多服务本地搭建

使用 Docker Compose 搭建完整的本地开发环境,涵盖服务依赖、数据卷、环境变量、健康检查及开发工作流。

Docker Compose 开发环境:多服务本地搭建

Docker Compose 开发环境:多服务搭建

完整开发栈

# docker-compose.yml
version: '3.9'

services:
  # 主应用
  api:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules  # 不覆盖容器的 node_modules
    environment:
      NODE_ENV: development
      DATABASE_URL: postgres://postgres:password@postgres:5432/mydb
      REDIS_URL: redis://redis:6379
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    command: npm run dev

  # 前端
  web:
    build:
      context: ./frontend
      dockerfile: Dockerfile.dev
    ports:
      - "5173:5173"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      VITE_API_URL: http://localhost:3000

  # PostgreSQL
  postgres:
    image: postgres:16-alpine
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./db/init:/docker-entrypoint-initdb.d  # 初始化脚本
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  # Redis
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 3

  # MailHog 用于邮件测试
  mailhog:
    image: mailhog/mailhog
    ports:
      - "1025:1025"  # SMTP
      - "8025:8025"  # Web UI

  # MinIO 用于 S3 兼容存储
  minio:
    image: minio/minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    volumes:
      - minio_data:/data
    command: server /data --console-address ":9001"

volumes:
  postgres_data:
  redis_data:
  minio_data:

Docker Compose 开发环境:多服务本地搭建 示意图

开发用 Dockerfile

# Dockerfile.dev
FROM node:20-alpine

WORKDIR /app

# 先安装依赖(更好的缓存)
COPY package*.json ./
RUN npm ci

# 源代码通过卷挂载,不复制
COPY . .

EXPOSE 3000
CMD ["npm", "run", "dev"]

Docker Compose 开发环境:多服务本地搭建 示意图

环境配置

# .env(开发默认值,提交到 git)
NODE_ENV=development
LOG_LEVEL=debug

# .env.local(密钥,不提交)
OPENAI_API_KEY=sk-...
STRIPE_SECRET_KEY=sk_test_...
# docker-compose.override.yml(本地覆盖,不提交)
services:
  api:
    environment:
      LOG_LEVEL: trace
    ports:
      - "9229:9229"  # Node.js 调试器
    command: npm run dev:debug

Docker Compose 开发环境:多服务本地搭建 示意图

常用命令

# 启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f api

# 重启单个服务
docker-compose restart api

# 在服务中运行命令
docker-compose exec api npm run db:migrate
docker-compose exec postgres psql -U postgres mydb

# 停止并清理
docker-compose down
docker-compose down -v  # 同时移除数据卷

# Dockerfile 更改后重新构建
docker-compose build api
docker-compose up -d --build api

基于 Profile 的服务

# 可选服务,使用 profiles
services:
  pgadmin:
    image: dpage/pgadmin4
    profiles: ["tools"]
    ports:
      - "5050:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@example.com
      PGADMIN_DEFAULT_PASSWORD: admin
# 启动时包含可选工具
docker-compose --profile tools up -d

Docker Compose 通过使开发环境可重现,消除了“在我机器上能运行”的问题。