背景介绍
在现代 Web 开发中,一个完整的应用通常包含多个组件:Web 服务器、数据库、缓存、消息队列等。Docker Compose 可以帮助我们定义和运行多个容器,实现本地开发环境与生产环境的一致性。
本文将介绍如何从 0 开始搭建一个完整的 Docker Compose 部署流程,包括开发环境和生产环境的配置。
一、docker-compose.yml 基本配置
基础结构:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
- DATABASE_URL=postgres://db:5432/myapp
depends_on:
- db
- redis
db:
image: postgres:14-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: password
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
关键配置说明:
- version:指定 Compose 文件格式版本
- services:定义各个容器服务
- build:指定 Dockerfile 路径
- ports:端口映射
- volumes:卷挂载,实现数据持久化
- environment:环境变量
- depends_on:服务依赖关系
二、Dockerfile 最佳实践
多阶段构建(推荐):
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]
最佳实践要点:
- 使用多阶段构建:减小最终镜像体积
- 使用 Alpine 基础镜像:体积更小,安全性更高
- 使用非 root 用户:提高容器安全性
- 合理使用 .dockerignore:排除不必要的文件
- 使用 npm ci 替代 npm install:确保依赖版本一致
三、开发环境配置
docker-compose.dev.yml:
version: '3.8'
services:
web:
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev
ports:
- "3000:3000"
- "9229:9229" # 调试端口
开发环境特点:
- 代码热重载
- 调试端口暴露
- 更多日志输出
- 禁用缓存
四、生产环境部署
docker-compose.prod.yml:
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile.prod
environment:
- NODE_ENV=production
ports:
- "80:3000"
deploy:
replicas: 3
restart_policy:
condition: on-failure
nginx:
image: nginx:alpine
ports:
- "443:443"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./certificates:/etc/nginx/certs
depends_on:
- web
生产环境要点:
- 使用反向代理:Nginx 处理 SSL、负载均衡
- 多副本部署:提高可用性
- 重启策略:自动恢复故障容器
- 环境变量管理:使用 .env 文件
- 日志配置:集中收集日志
五、常用命令
| 命令 | 说明 |
|---|---|
docker-compose up |
启动所有服务 |
docker-compose up -d |
后台启动 |
docker-compose down |
停止并删除容器 |
docker-compose build |
构建镜像 |
docker-compose logs |
查看日志 |
docker-compose exec <service> <cmd> |
在容器中执行命令 |
六、安全与监控
安全建议:
- 避免使用 latest 标签:指定具体版本号
- 定期更新基础镜像:修复安全漏洞
- 限制容器权限:使用非 root 用户
- 加密敏感数据:使用 Docker Secrets
- 隔离网络:使用自定义网络
监控配置:
- 健康检查:配置 healthcheck
- 日志收集:使用 ELK 或 Loki
- 指标监控:使用 Prometheus + Grafana
七、常见问题与解决方案
- 端口冲突:检查宿主机端口是否被占用
- 网络不通:检查自定义网络配置
- 数据丢失:确保使用 volumes 持久化数据
- 镜像过大:使用多阶段构建
- 依赖顺序:正确使用 depends_on
总结
Docker Compose 是一个强大的工具,可以帮助我们:
- 快速搭建开发环境
- 保持开发与生产环境一致
- 简化多容器应用部署
- 提高团队协作效率
掌握 Docker Compose 的使用,可以大大提高你的开发和部署效率。