Docker Compose 开发环境

2026-06-22 · 6 阅读 · 303字
Docker微服务

Docker Compose 开发环境

为什么使用 Docker Compose

在微服务架构中,开发环境通常需要同时运行多个服务(API 网关、业务服务、数据库、缓存、消息队列等)。Docker Compose 可以通过一个 YAML 文件定义和运行多容器应用,消除"在我机器上能跑"的问题。

基本用法

docker-compose.yml

version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=postgres
      - REDIS_HOST=redis
    depends_on:
      - postgres
      - redis
    volumes:
      - .:/app
      - /app/node_modules

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  pgdata:

启动与停止

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

# 查看日志
docker-compose logs -f

# 启动特定服务
docker-compose up -d postgres redis

# 停止所有服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

多阶段构建

使用多阶段 Dockerfile 优化开发体验和镜像大小:

# 开发阶段
FROM node:20 AS development
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]

# 构建阶段
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 生产阶段
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]

开发环境优化

热重载

在开发环境中挂载源码目录并使用 nodemon 或类似工具实现热重载:

services:
  app:
    build:
      context: .
      target: development
    volumes:
      - .:/app          # 挂载源码,修改即时生效
      - /app/node_modules  # 屏蔽容器内的 node_modules

等待依赖就绪

使用 wait-for-it 脚本确保服务启动顺序:

services:
  app:
    depends_on:
      - postgres
      - redis
    command: ["./wait-for-it.sh", "postgres:5432", "--", "npm", "start"]

环境变量管理

使用 .env 文件管理环境变量:

DB_HOST=postgres
DB_PORT=5432
REDIS_HOST=redis
REDIS_PORT=6379
LOG_LEVEL=debug
services:
  app:
    env_file:
      - .env

多环境配置

基础配置(docker-compose.yml)

共享配置放在基础文件中。

开发环境覆盖(docker-compose.override.yml)

services:
  app:
    ports:
      - "9229:9229"  # debug port
    environment:
      - NODE_ENV=development
    volumes:
      - .:/app

生产环境

# docker-compose.prod.yml
services:
  app:
    build:
      target: production
    environment:
      - NODE_ENV=production
    restart: always
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

调试技巧

# 进入容器
docker-compose exec app bash

# 查看服务日志
docker-compose logs -f app

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

# 查看资源使用
docker-compose top