关于程序员:docker云托管serverless部署Node项目总结

53次阅读

共计 4628 个字符,预计需要花费 12 分钟才能阅读完成。

  • 前端进阶之旅:https://interview2.poetries.top
  • 博客:https://blog.poetries.top
  • 公众号 / 小程序:「前端进阶之旅」每天分享技术干货,学前端不迷路
  • 作者:程序员 poetry

一、云服务器 docker-compose 部署

装置 docker 环境

装置工具包

yum install yum-utils device-mapper-persistent-data lvm2 -y

设置阿里镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

装置 docker

yum install docker-ce docker-ce-cli containerd.io -y

启动 docker

systemctl start docker

# 设为开机启动
systemctl enable docker

设置 docker 镜像源

vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://register.docker-cn.com/"],
}

后续拉取镜像间接从 https://hub.docker.com 网站拉取速度更快

重启 docker

systemctl restart docker

装置 mysql 镜像测试

docker pull daocloud.io/library/mysql:8.0.20

运行 mysql 镜像

docker run -d -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456(设置登录明码) be0dbf01a0f3(镜像 ID)

进入 mysql 容器外部

至此 mysql 镜像搭建胜利,上面咱们应用 docker-compose 来治理 docker 容器,不在独自一个个装置 MySQL、redis、nginx

装置 docker-compose

# 应用国内源装置
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

设置 docker-compose 执行权限

chmod +x /usr/local/bin/docker-compose

创立软链

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否装置胜利:

$ docker-compose --version

docker-compose version 1.22.0, build f46880fe

编写 docker-compose

version: "3.0"

services: 
    # docker 容器启动的 redis 默认是没有 redis.conf 的配置文件,所以用 docker 启动 redis 之前,须要先去官网下载 redis.conf 的配置文件
    redis: # 服务名称
        container_name: redis # 容器名称
        image: daocloud.io/library/redis:6.0.3-alpine3.11 # 应用官网镜像
        # 配置 redis.conf 形式启动
        command: redis-server /usr/local/etc/redis/redis.conf --requirepass 123456 --appendonly yes # 设置 redis 登录明码 123456、--appendonly yes:这个命令是用于开启 redis 数据长久化
        # 无需配置文件形式启动
        # command: redis-server --requirepass 123456 --appendonly yes # 设置 redis 登录明码 123456
        ports:
            - 6380:6379 # 本机端口: 容器端口
        restart: on-failure # 主动重启
        volumes:
            - ./deploy/redis/db:/data # 把长久化数据挂载到宿主机
            - ./deploy/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf  # 把 redis 的配置文件挂载到宿主机
            - ./deploy/redis/logs:/logs # 用来寄存日志
        environment:
            - TZ=Asia/Shanghai  # 解决容器 时区的问题
        networks:
            - my-server

    mysql:
        container_name: mysql
        image: daocloud.io/library/mysql:8.0.20 # 应用官网镜像
        ports: 
            - 3307:3306 # 本机端口: 容器端口
        restart: on-failure
        environment: 
            - MYSQL_ROOT_PASSWORD=123456 # root 用户明码
        volumes:
            - ./deploy/mysql/db:/var/lib/mysql # 用来寄存了数据库表文件
            - ./deploy/mysql/conf/my.cnf:/etc/my.cnf # 寄存自定义的配置文件
            # 咱们在启动 MySQL 容器时主动创立咱们须要的数据库和表
            # mysql 官网镜像中提供了容器启动时主动 docker-entrypoint-initdb.d 下的脚本的性能
            - ./deploy/mysql/init:/docker-entrypoint-initdb.d/ # 寄存初始化的脚本
        networks: 
            - my-server

    server: # egg 服务
        container_name: server
        build: # 依据 Dockerfile 构建镜像
            context: .
            dockerfile: Dockerfile
        ports: 
            - 9000:9000
        restart: on-failure # 设置主动重启,这一步必须设置,次要是存在 mysql 还没有启动实现就启动了 node 服务
        networks: 
            - my-server
        depends_on: # node 服务依赖于 mysql 和 redis
            - redis
            - mysql

# 申明一下网桥  my-server。# 重要:将所有服务都挂载在同一网桥即可通过容器名来相互通信了
# 如 egg 连贯 mysql 和 redis,能够通过容器名来相互通信
networks:
    my-server:

nestjs/Dockerfile

FROM daocloud.io/library/node:14.7.0

# 设置时区
ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata && rm -rf /var/lib/apt/lists/*

# 创立工作目录
RUN mkdir -p /app

# 指定工作目录
WORKDIR /app

# 复制以后代码到 /app 工作目录
COPY . ./

# npm 源,选用国内镜像源以进步下载速度
# RUN npm config set registry https://registry.npm.taobao.org/

# npm 装置依赖
RUN npm install 
# 打包
RUN npm run build

# 启动服务
# "start:prod": "cross-env NODE_ENV=production node ./dist/src/main.js",
CMD npm run start:prod

EXPOSE 9000

批改代码

凋谢云服务器端口

凋谢端口 9000、6380、3307

启动我的项目

docker-compose -h 查看命令

  • docker-compose up 启动服务,控制台可见日志
  • docker-compose up -d 后盾启动服务
  • docker-compose build --no-cache 从新构建镜像不应用缓存 (最初docker-compose up -d 启动)
  • 进行服务 docker-compose down
  • 下载镜像过程 docker-compose pull
  • 重启服务 docker-compose restart

后盾启动服务 docker-compose up -d

测试

二、微信云托管部署

云托管流水线部署更不便

redis 服务

这里咱们下面部署应用的自建服务器上 docker 搭建的 redis 服务作为演示

mysql 服务

这里咱们下面部署应用的自建服务器上 docker 搭建的 mysql 服务作为演示

批改代码

而后上传代码到 github,通过云托管流水线构建

新建服务

点击公布后,云托管会执行 Dockerfile 构建流水线,到日志能够查看构建进度

微信云托管部署胜利后,能够在实例列表,点击进入容器看到代码,这里外面的内容不能批改,在容器启动后会笼罩

调试接口

测试 redis

三、腾讯云 serverless 部署

须要留神,云函数的代码包不能超过 500M

模板部署 — 部署 Nest.js 示例代码

  1. 登录 Serverless 利用控制台。
  2. 单击新建利用,抉择 Web 利用 >Nest.js 框架,如下图所示:
  1. 单击“下一步”,实现根底配置抉择
  • 上传形式,抉择示例代码间接部署,单击实现,即可开始利用的部署。
  • 部署实现后,您可在利用详情页面,查看示例利用的根本信息,并通过 API 网关生成的拜访门路 URL 进行拜访,查看您部署的 Nest.js 我的项目

自定义部署 nest

初始化您的 Nest.js 我的项目

npm i -g @nestjs/cli
nest new nest-app

在根目录下,执行以下命令在本地间接启动服务。

cd nest-app && npm run start

关上浏览器拜访 http://localhost:3000,即可在本地实现 Nest.js 示例我的项目的拜访。

部署上云

接下来执行以下步骤,对已初始化的我的项目进行简略批改,使其能够通过 Web Function 疾速部署,此处我的项目革新通常分为以下两步:

  • 新增 scf_bootstrap 启动文件。
  • 批改监听地址与端口为 0.0.0.0:9000
  1. 批改启动文件main.ts,监听端口改为9000:
  1. 在我的项目根目录下新建 scf_bootstrap 启动文件,在该文件增加如下内容(用于启动服务):

您也能够在控制台实现该模块配置。

# scf_bootstrap
#!/bin/bash

SERVERLESS=1 /var/lang/node12/bin/node ./dist/main.js

新建实现后,还需执行以下命令批改文件可执行权限,默认须要 777 或 755 权限才可失常启动。示例如下:

chmod 777 scf_bootstrap

本地配置实现后,执行启动文件,确保您的服务能够本地失常启动,接下来,登录 Serverless 利用控制台,抉择 Web 利用 >Nest.js 框架,上传形式能够抉择本地上传或代码仓库拉取

留神:启动文件以我的项目内文件为准,如果您的我的项目里曾经蕴含 scf_bootstrap 文件,将不会笼罩该内容。

单个函数代码体积 500mb 的下限。在实际操作中,云函数尽管提供了 500mb

对于绕过配额问题:

如果超的不多,那么应用 npm install --production 就能解决问题

本文由 mdnice 多平台公布

正文完
 0