新入手 ECS 服务器,CentOS7 + Docker 从零打造 nestjs 运行环境

311 阅读5分钟

目录

  1. 新入手 ECS 服务器,CentOS7 + Docker 打造 nestjs 运行环境
  2. 生产发布,搭建 nestjs + redis + mysql 运行环境

前段时间跟着神光操作了一波 nestjs,前面曾部署 nestjs 到 serverless 上,跑着还可以,但还是得解决 redis 和 mysql 服务的问题,而两个的serverless 服务超贵。

刚好这几天阿里双十一搞活动,ECS 服务新老用户都只要 99 元,对我来说,给力够用,果断入手一台

这里选择 CentOS7 系统,开通后立马就开始折腾了

登录系统

在实例右侧,点 远程连接

image.png

有以下多种登录方式

image.png

咱就用第一个吧,好久没玩服务,阿里云这个服务,开通时没太注意有设置密码,不知道密码是啥?

image.png

经过探索排查,这里可以使用重置密码功能,重设密码,我们这里设置好,就可以登录进去了

安装 Docker

这里我们要安装下 Docker

这里我们参考此文:cloud.tencent.com/developer/a…

我这里把用到的命令总结如下

# 检查系统版本,linux 内核 3.10+ 满足条件
uname -r

# 使用 root 权限更新 yum 包
yum -y update

# 注意
# yum -y update:升级所有包同时也升级软件和系统内核;
# yum -y upgrade:只升级所有包,不升级软件和系统内核

# 卸载旧版本(如果之前安装过的话)
yum remove docker docker-common docker-selinux docker-engine

# 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置 yum 源,下面两个都可以
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)

## 更新 yum 缓存
yum makecache fast

# 安装 Docker CE 及其配套插件
yum install -y docker-ce

# 查看 Docker 可用版本有哪些
# 如果需要安装特定版本的 Docker CE,可以先列出可用版本:
yum list docker-ce --showduplicates | sort -r
yum list docker-ce.x86_64 --showduplicates | sort -r

# 选择 Docker 版本并安装(我们安装指定的最新稳定版)
# 格式 yum install docker-ce-版本号(会自动安装 docker-ce-cli containerd.io)
yum -y install docker-ce-24.0.7-1.el7
yum -y install docker-ce-26.1.4-1.el7

# 安装配套插件
yum -y install docker-buildx-plugin docker-compose-plugin

# 安装完成
docker -v

# 启动 Docker 并设置开机自启
systemctl start docker 
systemctl enable docker

# 重启
systemctl restart docker

构建 nestjs 运行环境

启动 docker 服务后

# 拉取镜像
docker pull node:20.9.0-alpine

这里我们使用 Dockerfile 来定制,这里有 Docker 入门实践教程

这里假设你已经将 nestjs 构建输出了 dist 目录,Dockerfile 与 dist 目录同级

FROM node:20-alpine

WORKDIR /app

COPY package.json pnpm-lock.yaml .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm i -g pnpm
RUN pnpm install

COPY . .

RUN pnpm run build
COPY .env dist/.env

EXPOSE 3000

CMD ["node", "dist/src/main.js"]

运行 docker-compose 收到警告

CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
  from cryptography.hazmat.backends import default_backend
  

这是一个弃用警告,表明 cryptography 库不再支持 Python 3.6。虽然目前你的系统仍然可以运行,但未来可能会出现问题,尤其是当 cryptography 更新到完全移除 Python 3.6 支持的版本时。

paramiko 是一个用于 SSH 连接的 Python 库,它依赖于 cryptography。这个警告是通过 paramiko 触发的,但根源在于 cryptography

可以暂时不管

构建镜像运行容器

# 构建镜像
docker build -t nestjs:1 .

# 运行容器
docker run -d --name nestjs-1 -p 3000:3000 nestjs:1

容器运行报错了

2023-11-15 11:19:36 node:internal/modules/cjs/loader:1327
2023-11-15 11:19:36   return process.dlopen(module, path.toNamespacedPath(filename));
2023-11-15 11:19:36                  ^
2023-11-15 11:19:36 
2023-11-15 11:19:36 Error: Error loading shared library /app/node_modules/.pnpm/bcrypt@5.1.1/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: Exec format error
2023-11-15 11:19:36     at Module._extensions..node (node:internal/modules/cjs/loader:1327:18)
2023-11-15 11:19:36     at Module.load (node:internal/modules/cjs/loader:1091:32)
2023-11-15 11:19:36     at Module._load (node:internal/modules/cjs/loader:938:12)
2023-11-15 11:19:36     at Module.require (node:internal/modules/cjs/loader:1115:19)
2023-11-15 11:19:36     at require (node:internal/modules/helpers:130:18)
2023-11-15 11:19:36     at Object.<anonymous> (/app/node_modules/.pnpm/bcrypt@5.1.1/node_modules/bcrypt/bcrypt.js:6:16)
2023-11-15 11:19:36     at Module._compile (node:internal/modules/cjs/loader:1241:14)
2023-11-15 11:19:36     at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
2023-11-15 11:19:36     at Module.load (node:internal/modules/cjs/loader:1091:32)
2023-11-15 11:19:36     at Module._load (node:internal/modules/cjs/loader:938:12) {
2023-11-15 11:19:36   code: 'ERR_DLOPEN_FAILED'
2023-11-15 11:19:36 }
2023-11-15 11:19:36 
2023-11-15 11:19:36 Node.js v20.9.0

上面的错误是因为忘记添加 .dockerignore 忽略 node_modules 了,导致安装的依赖被 COPY 操作覆盖

重新配置

FROM node:20-alpine

WORKDIR /app

COPY package.json pnpm-lock.yaml .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm i -g pnpm pm2
RUN pnpm install

COPY . .

RUN pnpm run build

EXPOSE 3000

CMD ["node", "dist/src/main.js"]
# CMD ["pm2-runtime", "dist/src/main.js"]

# debug
# CMD ["sleep", "1h"]

这样就可以了

下一篇,生产发布,搭建 nestjs + redis + mysql 运行环境