# 一、云服务器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 示例代码
- 登录 Serverless 应用控制台。
- 单击新建应用,选择Web 应用>Nest.js 框架,如下图所示:

- 单击“下一步”,完成基础配置选择

- 上传方式,选择示例代码直接部署,单击完成,即可开始应用的部署。
- 部署完成后,您可在应用详情页面,查看示例应用的基本信息,并通过 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。
- 修改启动文件
main.ts,监听端口改为9000:

- 在项目根目录下新建
scf_bootstrap启动文件,在该文件添加如下内容(用于启动服务):
您也可以在控制台完成该模块配置。

# scf_bootstrap
#!/bin/bash
SERVERLESS=1 /var/lang/node12/bin/node ./dist/main.js
@前端进阶之旅: 代码已经复制到剪贴板
chmod 777 scf_bootstrap
@前端进阶之旅: 代码已经复制到剪贴板

