使用docker部署nestjs应用

准备

Demo创建

要部署,我们肯定得有一个nestjs项目,哪怕是做的一个demo吧,这里我们就用一个默认的nestjs cli创建的项目作为示例。输入以下命令创建项目:

shell 复制代码
nest new nestjs-docker-demo

没有安装nestjs cli的需要先安装,命令:

shell 复制代码
npm i -g @nestjs/cli

尝试运行

执行以下命令运行测试环境,看看demo是否能启动:

shell 复制代码
npm run start:dev

成功启动后,访问http://localhost:4000应该如下图(默认3000我改了端口号)所示:

到现在,一个已经完成的demo就已经准备好了,接下来,我们进行打包构建并部署。

打包的小坑

打包nestjs的项目很简单,只要执行npm run build就会通过它的脚手架帮助我们自行打包,但是这里还是要注意一点小坑。 如果创建了不需要在生产环境使用的自定义文件夹的话,请忽略!!!

例如,正常打包目录应该如下:

但如果,这时候我们在根目录创建了例如一个scripts目录,里面存放了一些处理脚本的命令的话,那么打包之后的目录结构如下:

这将会导致一个问题,当我们执行:npm run start:prod的时候,对应执行node dist/main会找不到对应模块,此时我们应该修改启动命令或者在tsconfig.build.json文件中忽略该目录!

json 复制代码
{
  "extends": "./tsconfig.json",
  "exclude": ["node_modules", "test", "dist", "**/*spec.ts", "scripts"]
}

Docker

Dockerfile

要使用Docker部署项目,首先必须得给我们的nestjs应用创造一个镜像,在项目根目录中创建Dockerfile文件,内容如下:

yaml 复制代码
FROM node:22

WORKDIR /usr/src/app

COPY . .

RUN npm --registry https://registry.npmmirror.com
RUN npm run build

RUN rm -rf src

EXPOSE 4000

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

上面代码的意义如下:

  1. 基于node版本22的镜像作为基础镜像,下面的操作都依赖于此;
  2. 设置工作目录,这里是指在Docker中文件的目录;
  3. 执行命令install命令安装依赖;
  4. 开放我们需要监听的端口,我用的轻量级服务器测试,需要在宝塔和阿里云两个地方都开放;
  5. 执行命令npm run start:prod表示启动应用。

上面的执行命令RUNCMD的区别在于RUN是构建镜像时就执行,CMD是启动容器时才执行。

当编写完成上述文件后,通过命令 docker build -t nestjs-api . 来测试是否可以创建镜像。

Dockerfile构建问题

构建镜像时可能遇到构建失败的情况,例如:

shell 复制代码
Error: failed to solve: node:22: failed to resolve source metadata for docker.io

所以我们首先得保证:

  1. 你得保证已经docker login登录;
  2. 你的docker镜像源得有效,这里分享几个镜像源:
json 复制代码
"registry-mirrors": [
  "https://registry.docker-cn.com",
  "https://docker.mirrors.ustc.edu.cn",
  "https://hub-mirror.c.163.com",
  "https://hub.geekery.cn",
  "https://dockerpull.com"
]

docker-compose.yml

依赖上面的操作,我们其实已经可以创建一个Docker镜像并执行了,但在实际上部署时,还需要通过编写docker-compose.yml文件来配合使用。

在根目录中,创建docker-compose.yml文件,编写如下内容:

yaml 复制代码
services:
  nestjs_api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 4000:4000
    env_file:
      - .env.production
    volumes:
      - ./src:/usr/src/app/src
    networks:
      - backend

networks:
  backend:

现在来解释一下上面字段的意思:

  • build:指定构建的镜像源,这里就是通过上面的Dockerfile创建的镜像源;
  • ports:该服务从本地映射到docker中的对应端口;
  • environment: 需要传递到该应用的环境变量;
  • volumns: 该服务从本地磁盘内容映射到docker中的队友文件夹;
  • networks: 网关为backend,很重要,如果有其他服务,例如mysql服务,那么保证两者同一个网关时nestjs时才去访问mysql服务。

部署

完成上述步骤后,我们将我们编写的代码和docker需要的文件都上传到服务器上面去,然后打开对应目录的终端,执行以下命令:

css 复制代码
docker-compose --env-file .env.production up -d

接着,就会自动构建镜像并且开始运行nestjs的服务。

注意环境变量的文件,这里是.env.production文件,保证该文件有我们需要的环境变量

当启动成功后,我们可以打开浏览器或者其他工具进行Api访问进行服务是否启动成功。

相关推荐
Bl_a_ck1 小时前
npm、nvm、nrm
前端·vue.js·npm·node.js·vue
zhu_zhu_xia1 小时前
npm包管理工具理解
前端·npm·node.js
eason_fan2 小时前
解决nvm安装指定版本node失败的方法
前端·node.js
全栈派森3 小时前
Web认证宇宙漫游指南
python·node.js
夏虫不与冰语3 小时前
nvm切换node版本后,解决npm找不到的问题
node.js
冰墩墩13 小时前
使用nvm install XXX 下载node版本时网络不好导致npm下载失败解决方案
前端·npm·node.js
techdashen4 小时前
性能比拼: Node.js vs Go
开发语言·golang·node.js
Mintopia5 小时前
Node.js 对前端技术有利的知识点
前端·javascript·node.js
一道雷5 小时前
🛠️ Unindex:推荐一款自动化索引文件生成工具
前端·javascript·node.js
weixin_748877007 小时前
【Node.js中的错误处理:策略与最佳实践】
node.js·编辑器·vim