NestJS部署到Docker指南
在将NestJS应用部署到Docker时遇到几个问题想请教:
-
我的NestJS项目已经开发完成,但不知道如何编写适合的Dockerfile?能否分享一个标准的NestJS Dockerfile模板?
-
在构建Docker镜像时,发现node_modules也被打包进去了,导致镜像体积很大。请问如何优化Dockerfile来减小镜像尺寸?
-
使用docker-compose部署时,NestJS应用需要连接MongoDB,如何正确配置容器间的网络连接?
-
生产环境部署时,应该选择哪个Node.js基础镜像比较好?是-alpine版本还是slim版本?
-
在Docker容器中运行时,NestJS的热重载功能失效了,这在开发时很不方便,有没有解决方案?
-
如何为容器化的NestJS应用配置日志收集?现在日志都输出到容器内部,不方便查看。
首先,创建一个Dockerfile
文件。从Node.js基础镜像开始,设置工作目录,拷贝项目文件并安装依赖:
FROM node:16-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
接着构建生产环境镜像并暴露端口:
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/main"]
构建镜像:docker build -t my-nestjs-app .
运行容器:docker run -p 3000:3000 my-nestjs-app
为了方便管理,可以使用docker-compose.yml
配置服务、网络和卷:
version: '3'
services:
nestjs:
build: .
ports:
- "3000:3000"
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
使用docker-compose up
启动应用。如果修改代码,只需重启容器即可看到更新,无需重新构建镜像。记得开放服务器防火墙端口并确保网络安全。
-
创建项目:首先确保你已经用NestJS创建好了一个项目。
-
安装Docker相关依赖:在项目根目录下初始化
package.json
,然后安装@nestjs/cli
和@nestjs/common
等必要依赖。接着安装docker
相关的镜像构建工具,如dockerfile
生成器。 -
编写Dockerfile:
# 使用官方Node.js运行时镜像作为基础镜像 FROM node:16-alpine # 创建应用工作目录 WORKDIR /usr/src/app # 安装项目依赖 COPY package*.json ./ RUN npm install --production # 复制项目文件到容器中 COPY . . # 暴露端口 EXPOSE 3000 # 启动应用 CMD ["npm", "run", "start:prod"]
-
构建Docker镜像:在项目根目录下执行命令
docker build -t nestjs-app .
。 -
运行容器:使用
docker run -p 3000:3000 nestjs-app
来启动你的NestJS应用。 -
优化与发布:可以将生成的镜像推送到Docker Hub或其他私有镜像仓库以便后续部署或团队共享。记得设置环境变量和配置数据库连接等信息。
NestJS部署到Docker指南
基本步骤
- 创建Dockerfile
# 阶段一:构建应用
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 阶段二:生产运行
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/main"]
- 创建docker-compose.yml
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
部署步骤
- 确保已安装Docker和Docker Compose
- 在项目根目录创建上述文件
- 运行以下命令:
docker-compose build
docker-compose up -d
优化建议
- 使用
.dockerignore
文件忽略不必要的文件 - 多阶段构建减少镜像体积
- 考虑添加健康检查
- 对于生产环境,建议使用PM2等进程管理工具
常见问题
- 端口冲突:检查3000端口是否被占用
- 构建失败:确保本地能正常构建后再Docker化
- 环境变量:通过
-e
或.env
文件传递必要变量
部署后可通过http://localhost:3000
访问应用。