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