Nestjs项目实战 Docker容器化部署方案

在NestJS项目中采用Docker容器化部署时,如何配置最优化的Dockerfile?针对多环境(开发/生产)部署,怎样通过docker-compose.yml管理服务依赖(如PostgreSQL/Redis)?容器化后如何解决NestJS应用与数据库之间的网络通信问题?另外,在生产环境部署时,如何结合CI/CD流程实现自动化构建和镜像推送?对于性能监控和日志收集,在容器环境下有哪些推荐的实践方案?

3 回复

在NestJS项目中进行Docker容器化部署,首先需要准备一个Dockerfile。在Dockerfile中,先使用node:16-alpine作为基础镜像,设置工作目录为/app,并复制package.json和package-lock.json文件到容器中,执行npm ci --only=production安装生产依赖。接着复制项目的所有文件到容器中,构建前端资源(如果有前端部分),最后暴露应用端口并指定启动命令。

接着创建docker-compose.yml文件,定义服务、网络和卷。确保服务名称与实际项目一致,设置环境变量如NODE_ENV=production,配置数据库连接等参数。如果项目需要缓存或日志持久化,可以定义数据卷。同时,设置好与宿主机的端口映射。

完成这些后,运行docker-compose up -d即可启动服务。为了监控容器状态,可以通过docker ps查看。如果遇到问题,检查Dockerfile和docker-compose.yml是否正确配置,以及宿主机环境是否满足需求。


在使用Docker容器化部署NestJS项目时,首先需要构建一个Dockerfile。基础镜像可以选用Node.js官方镜像,比如node:16-alpine。将你的NestJS项目代码复制到镜像中,并安装依赖。

FROM node:16-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --production

COPY . .

EXPOSE 3000
CMD ["npm", "run", "start:prod"]

其中,start:prod是在package.json的scripts中定义的生产环境启动命令,确保使用的是优化后的代码。

构建镜像后,可以通过docker build -t nestjs-app .生成镜像。运行时可直接使用docker run -p 3000:3000 nestjs-app

对于生产环境,建议使用Docker Compose来管理多个服务(如数据库、缓存等)。创建docker-compose.yml文件:

version: '3'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword

通过docker-compose up -d即可一键部署所有服务。记得在生产环境中添加持久化存储和环境变量配置。

NestJS项目Docker容器化部署方案

基本部署方案

  1. 创建Dockerfile (放在项目根目录):
# 使用官方Node.js镜像作为基础
FROM node:16-alpine

# 创建工作目录
WORKDIR /usr/src/app

# 复制package.json和lock文件
COPY package*.json ./
COPY yarn.lock ./

# 安装依赖
RUN yarn install

# 复制项目文件
COPY . .

# 构建生产环境应用
RUN yarn build

# 暴露应用端口(根据你的NestJS应用实际端口)
EXPOSE 3000

# 运行应用
CMD ["node", "dist/main.js"]
  1. 创建.dockerignore文件 (避免不必要的文件被复制):
node_modules
dist
.env
Dockerfile
.dockerignore
.git
.gitignore
  1. 构建Docker镜像:
docker build -t nestjs-app .
  1. 运行容器:
docker run -p 3000:3000 -d nestjs-app

进阶优化方案

使用多阶段构建

# 第一阶段:构建阶段
FROM node:16-alpine AS builder

WORKDIR /usr/src/app
COPY package*.json ./
COPY yarn.lock ./
RUN yarn install
COPY . .
RUN yarn build

# 第二阶段:运行阶段
FROM node:16-alpine

WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/node_modules ./node_modules
COPY --from=builder /usr/src/app/dist ./dist
COPY package.json .

EXPOSE 3000
CMD ["node", "dist/main.js"]

使用Docker Compose

创建docker-compose.yml文件:

version: '3'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    restart: unless-stopped

然后运行:

docker-compose up -d

生产环境建议

  1. 使用.env文件管理环境变量
  2. 配置日志收集
  3. 设置容器资源限制
  4. 考虑添加健康检查
  5. 使用Nginx作为反向代理

需要更详细的哪个部分可以告诉我,我会进一步展开说明。

回到顶部