DevOps

Docker Compose 多容器部署指南:从开发到生产环境的完整流程

如何用 Docker Compose 本地开发,然后无缝迁移到服务器生产环境,包含详细配置示例。

Docker Compose 多容器部署指南:从开发到生产环境的完整流程封面图
Fkiex 技术团队 2026年5月10日 9 分钟 技术文章

背景介绍

在现代 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"]

最佳实践要点:

  1. 使用多阶段构建:减小最终镜像体积
  2. 使用 Alpine 基础镜像:体积更小,安全性更高
  3. 使用非 root 用户:提高容器安全性
  4. 合理使用 .dockerignore:排除不必要的文件
  5. 使用 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

生产环境要点:

  1. 使用反向代理:Nginx 处理 SSL、负载均衡
  2. 多副本部署:提高可用性
  3. 重启策略:自动恢复故障容器
  4. 环境变量管理:使用 .env 文件
  5. 日志配置:集中收集日志

五、常用命令

命令 说明
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

七、常见问题与解决方案

  1. 端口冲突:检查宿主机端口是否被占用
  2. 网络不通:检查自定义网络配置
  3. 数据丢失:确保使用 volumes 持久化数据
  4. 镜像过大:使用多阶段构建
  5. 依赖顺序:正确使用 depends_on

总结

Docker Compose 是一个强大的工具,可以帮助我们:

  1. 快速搭建开发环境
  2. 保持开发与生产环境一致
  3. 简化多容器应用部署
  4. 提高团队协作效率

掌握 Docker Compose 的使用,可以大大提高你的开发和部署效率。

落地补充说明

Docker Compose 很适合中小项目的标准化部署,但不要把它当成万能方案。它解决的是环境一致性和部署可重复性,不自动解决监控、备份、安全和扩容问题。

生产环境使用 Compose 时,应把配置和密钥分开。镜像版本要固定,不建议长期使用 latest。数据库、上传文件和日志目录要使用持久化卷,并把备份脚本纳入发布流程。

上线前建议准备回滚方案:旧镜像是否保留,数据库是否有迁移脚本,配置变更是否可撤销,健康检查是否能及时发现失败。部署不是执行命令,而是一套可重复的流程。

执行检查清单

  • 先确认业务目标,再确定功能范围,避免为了技术而技术。
  • 把关键决策写成文档,包括负责人、截止时间、验收标准和风险项。
  • 上线前至少完成一次真实数据演练,并记录发现的问题和处理结果。

需要部署帮助?

如果你的项目需要 Docker 部署支持,可以联系我们提供 DevOps 服务。