简介:本文详细介绍了如何使用 Docker Compose 部署 Nest.js 应用,涵盖环境准备、Dockerfile 编写、docker-compose.yml 配置、构建与运行、数据持久化及生产环境优化等内容,帮助开发者快速实现标准化部署。
在微服务架构盛行的今天,Nest.js 凭借其 TypeScript 支持、模块化设计和开箱即用的依赖注入系统,已成为构建企业级 Node.js 应用的首选框架。而 Docker Compose 通过声明式配置管理多容器应用,极大简化了开发、测试和部署流程。本文将系统阐述如何使用 Docker Compose 部署 Nest 应用,覆盖从环境准备到生产优化的全流程。
部署前需确保开发环境满足以下条件:
建议通过 nvm 管理 Node.js 版本,避免全局安装冲突。对于团队项目,可在 README.md 中明确指定 Node.js 和 npm 版本要求。
遵循 Nest 官方推荐的项目结构:
src/├── modules/ # 业务模块├── common/ # 通用工具├── config/ # 环境配置├── main.ts # 应用入口└── app.module.ts # 根模块docker/├── production/ # 生产环境配置└── development/ # 开发环境配置docker-compose.yml # 主配置文件
这种分层结构便于区分不同环境的配置,同时保持代码与部署配置的解耦。
创建 Dockerfile 时需注意以下关键点:
# 使用多阶段构建减小镜像体积FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm install --production=falseCOPY . .RUN npm run build# 生产环境镜像FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/node_modules ./node_modulesCOPY --from=builder /app/dist ./distCOPY --from=builder /app/package*.json ./EXPOSE 3000CMD ["npm", "run", "start:prod"]
优化要点:
node_modules 和构建产物基础配置示例:
version: '3.8'services:app:build: .ports:- '3000:3000'environment:- NODE_ENV=production- DATABASE_URL=mongodb://db:27017/nestdepends_on:- dbdb:image: mongo:6.0volumes:- db_data:/data/dbenvironment:- MONGO_INITDB_ROOT_USERNAME=admin- MONGO_INITDB_ROOT_PASSWORD=secretvolumes:db_data:
关键配置解析:
version: '3.8' 指定 Compose 文件版本build: . 指向当前目录的 Dockerfiledepends_on 定义服务启动顺序db_data 实现数据持久化.env 文件管理更安全开发模式需要热重载和调试支持:
# docker-compose.dev.ymlversion: '3.8'services:app:build:context: .target: builder # 停留在构建阶段command: npm run start:devvolumes:- .:/app- /app/node_modules # 匿名卷避免绑定冲突ports:- '3000:3000'- '9229:9229' # Node.js 调试端口environment:- NODE_ENV=development
使用方式:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
生产部署需考虑:
资源限制:
services:app:deploy:resources:limits:cpus: '0.5'memory: 512M
健康检查:
healthcheck:test: ['CMD-SHELL', 'curl -f http://localhost:3000/health || exit 1']interval: 30stimeout: 10sretries: 3
日志管理:
logging:driver: 'json-file'options:max-size: '10m'max-file: '3'
现象:修改代码后 Docker 未重新构建依赖层。
解决方案:
--no-cache 强制重建:
docker compose build --no-cache
COPY 顺序,将频繁变更的文件放在后面场景:本地 3000 端口被占用。
解决方案:
ports 映射:
ports:- '3001:3000' # 主机端口改为3001
然后通过
ports:- '3000' # 仅指定容器端口
docker port 命令查询实际映射问题:MongoDB 数据重启后丢失。
排查步骤:
docker volume ls
docker inspect <container_id> | grep Mounts
docker volume rm db_datadocker compose up -d
volumes:- ./data/db:/data/db
环境分离原则:
.env 文件管理敏感信息镜像构建优化:
.dockerignore 排除无关文件服务发现配置:
# 使用自定义网络实现服务自动发现networks:app-network:driver: bridgeservices:app:networks:- app-networkdb:networks:- app-network
安全加固措施:
对于多服务 Nest 应用:
version: '3.8'services:auth-service:build: ./services/authenvironment:- JWT_SECRET=${JWT_SECRET}order-service:build: ./services/orderdepends_on:- redisredis:image: redis:7-alpine
GitHub Actions 示例:
name: Deploy Nest Appon:push:branches: [ main ]jobs:deploy:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Login to Docker Hubuses: docker/login-action@v2with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: Build and pushuses: docker/build-push-action@v4with:context: .push: truetags: myrepo/nest-app:latest- name: Deploy to serveruses: appleboy/ssh-action@v1with:host: ${{ secrets.SERVER_IP }}username: ${{ secrets.SERVER_USER }}key: ${{ secrets.SSH_PRIVATE_KEY }}script: |docker compose pulldocker compose up -d
添加 nestjs-prometheus 依赖:
npm install @quixo3/nestjs-prometheus
配置 Prometheus 服务:
services:prometheus:image: prom/prometheus:v2.44volumes:- ./prometheus.yml:/etc/prometheus/prometheus.ymlports:- '9090:9090'
创建 prometheus.yml:
scrape_configs:- job_name: 'nest-app'static_configs:- targets: ['app:3000']
使用 ELK 栈处理日志:
services:logstash:image: docker.elastic.co/logstash/logstash:8.11.1volumes:- ./logstash.conf:/usr/share/logstash/pipeline/logstash.confdepends_on:- elasticsearchelasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1environment:- discovery.type=single-nodeports:- '9200:9200'kibana:image: docker.elastic.co/kibana/kibana:8.11.1ports:- '5601:5601'depends_on:- elasticsearch
通过 Docker Compose 部署 Nest 应用,开发者可以获得以下优势:
未来发展方向包括:
掌握 Docker Compose 部署 Nest 应用的技能,不仅能帮助开发者构建可扩展的微服务架构,更为向云原生架构演进奠定坚实基础。建议开发者持续关注 Docker 和 Nest.js 官方文档的更新,保持技术栈的先进性。