- 前端進(jìn)階之旅:https://interview2.poetries.top
- 博客:https://blog.poetries.top
- 公眾號(hào)/小程序:「前端進(jìn)階之旅」 每天分享技術(shù)干貨照皆,學(xué)前端不迷路
- 作者:程序員poetry
一、云服務(wù)器docker-compose部署
安裝docker環(huán)境
安裝工具包
yum install yum-utils device-mapper-persistent-data lvm2 -y
設(shè)置阿里鏡像源
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
啟動(dòng)docker
systemctl start docker
# 設(shè)為開機(jī)啟動(dòng)
systemctl enable docker
設(shè)置docker鏡像源
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://register.docker-cn.com/"
],
}
后續(xù)拉取鏡像直接從 https://hub.docker.com 網(wǎng)站拉取速度更快
重啟docker
systemctl restart docker
安裝mysql鏡像測(cè)試
docker pull daocloud.io/library/mysql:8.0.20
運(yùn)行mysql鏡像
docker run -d -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456(設(shè)置登錄密碼) be0dbf01a0f3(鏡像ID)
進(jìn)入mysql容器內(nèi)部
至此mysql鏡像搭建成功,下面我們使用
docker-compose
來管理docker容器,不在單獨(dú)一個(gè)個(gè)安裝MySQL、redis、nginx
安裝docker-compose
# 使用國內(nèi)源安裝
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
設(shè)置docker-compose執(zhí)行權(quán)限
chmod +x /usr/local/bin/docker-compose
創(chuàng)建軟鏈
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
測(cè)試是否安裝成功:
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
編寫docker-compose
version: "3.0"
services:
# docker容器啟動(dòng)的redis默認(rèn)是沒有redis.conf的配置文件,所以用docker啟動(dòng)redis之前挺邀,需要先去官網(wǎng)下載redis.conf的配置文件
redis: # 服務(wù)名稱
container_name: redis # 容器名稱
image: daocloud.io/library/redis:6.0.3-alpine3.11 # 使用官方鏡像
# 配置redis.conf方式啟動(dòng)
command: redis-server /usr/local/etc/redis/redis.conf --requirepass 123456 --appendonly yes # 設(shè)置redis登錄密碼 123456、--appendonly yes:這個(gè)命令是用于開啟redis數(shù)據(jù)持久化
# 無需配置文件方式啟動(dòng)
# command: redis-server --requirepass 123456 --appendonly yes # 設(shè)置redis登錄密碼 123456
ports:
- 6380:6379 # 本機(jī)端口:容器端口
restart: on-failure # 自動(dòng)重啟
volumes:
- ./deploy/redis/db:/data # 把持久化數(shù)據(jù)掛載到宿主機(jī)
- ./deploy/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf # 把redis的配置文件掛載到宿主機(jī)
- ./deploy/redis/logs:/logs # 用來存放日志
environment:
- TZ=Asia/Shanghai # 解決容器 時(shí)區(qū)的問題
networks:
- my-server
mysql:
container_name: mysql
image: daocloud.io/library/mysql:8.0.20 # 使用官方鏡像
ports:
- 3307:3306 # 本機(jī)端口:容器端口
restart: on-failure
environment:
- MYSQL_ROOT_PASSWORD=123456 # root用戶密碼
volumes:
- ./deploy/mysql/db:/var/lib/mysql # 用來存放了數(shù)據(jù)庫表文件
- ./deploy/mysql/conf/my.cnf:/etc/my.cnf # 存放自定義的配置文件
# 我們?cè)趩?dòng)MySQL容器時(shí)自動(dòng)創(chuàng)建我們需要的數(shù)據(jù)庫和表
# mysql官方鏡像中提供了容器啟動(dòng)時(shí)自動(dòng)docker-entrypoint-initdb.d下的腳本的功能
- ./deploy/mysql/init:/docker-entrypoint-initdb.d/ # 存放初始化的腳本
networks:
- my-server
server: # egg服務(wù)
container_name: server
build: # 根據(jù)Dockerfile構(gòu)建鏡像
context: .
dockerfile: Dockerfile
ports:
- 9000:9000
restart: on-failure # 設(shè)置自動(dòng)重啟跳座,這一步必須設(shè)置悠夯,主要是存在mysql還沒有啟動(dòng)完成就啟動(dòng)了node服務(wù)
networks:
- my-server
depends_on: # node服務(wù)依賴于mysql和redis
- redis
- mysql
# 聲明一下網(wǎng)橋 my-server。
# 重要:將所有服務(wù)都掛載在同一網(wǎng)橋即可通過容器名來互相通信了
# 如egg連接mysql和redis躺坟,可以通過容器名來互相通信
networks:
my-server:
nestjs/Dockerfile
FROM daocloud.io/library/node:14.7.0
# 設(shè)置時(shí)區(qū)
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/*
# 創(chuàng)建工作目錄
RUN mkdir -p /app
# 指定工作目錄
WORKDIR /app
# 復(fù)制當(dāng)前代碼到/app工作目錄
COPY . ./
# npm 源沦补,選用國內(nèi)鏡像源以提高下載速度
# RUN npm config set registry https://registry.npm.taobao.org/
# npm 安裝依賴
RUN npm install
# 打包
RUN npm run build
# 啟動(dòng)服務(wù)
# "start:prod": "cross-env NODE_ENV=production node ./dist/src/main.js",
CMD npm run start:prod
EXPOSE 9000
修改代碼
開放云服務(wù)器端口
開放端口9000、6380咪橙、3307
啟動(dòng)項(xiàng)目
docker-compose -h
查看命令
-
docker-compose up
啟動(dòng)服務(wù)夕膀,控制臺(tái)可見日志 -
docker-compose up -d
后臺(tái)啟動(dòng)服務(wù) -
docker-compose build --no-cache
重新構(gòu)建鏡像不使用緩存(最后docker-compose up -d
啟動(dòng)) - 停止服務(wù)
docker-compose down
- 下載鏡像過程
docker-compose pull
- 重啟服務(wù)
docker-compose restart
后臺(tái)啟動(dòng)服務(wù) docker-compose up -d
測(cè)試
二、微信云托管部署
云托管流水線部署更方便
redis服務(wù)
這里我們上面部署使用的自建服務(wù)器上docker搭建的redis服務(wù)作為演示
mysql服務(wù)
這里我們上面部署使用的自建服務(wù)器上docker搭建的mysql服務(wù)作為演示
修改代碼
然后上傳代碼到github美侦,通過云托管流水線構(gòu)建
新建服務(wù)
點(diǎn)擊發(fā)布后产舞,云托管會(huì)執(zhí)行Dockerfile構(gòu)建流水線,到日志可以查看構(gòu)建進(jìn)度
微信云托管部署成功后菠剩,可以在實(shí)例列表易猫,點(diǎn)擊進(jìn)入容器看到代碼,這里里面的內(nèi)容不能修改具壮,在容器啟動(dòng)后會(huì)覆蓋
調(diào)試接口
測(cè)試redis
三准颓、騰訊云serverless部署
需要注意,云函數(shù)的代碼包不能超過500M
模板部署 -- 部署 Nest.js 示例代碼
- 登錄 Serverless 應(yīng)用控制臺(tái)棺妓。
- 單擊新建應(yīng)用攘已,選擇Web 應(yīng)用>Nest.js 框架,如下圖所示:
- 單擊“下一步”怜跑,完成基礎(chǔ)配置選擇
- 上傳方式样勃,選擇示例代碼直接部署,單擊完成,即可開始應(yīng)用的部署峡眶。
- 部署完成后剧防,您可在應(yīng)用詳情頁面,查看示例應(yīng)用的基本信息辫樱,并通過 API 網(wǎng)關(guān)生成的訪問路徑 URL 進(jìn)行訪問诵姜,查看您部署的 Nest.js 項(xiàng)目
自定義部署nest
初始化您的 Nest.js 項(xiàng)目
npm i -g @nestjs/cli
nest new nest-app
在根目錄下,執(zhí)行以下命令在本地直接啟動(dòng)服務(wù)搏熄。
cd nest-app && npm run start
打開瀏覽器訪問 http://localhost:3000,即可在本地完成 Nest.js 示例項(xiàng)目的訪問暇赤。
部署上云
接下來執(zhí)行以下步驟心例,對(duì)已初始化的項(xiàng)目進(jìn)行簡單修改,使其可以通過 Web Function 快速部署鞋囊,此處項(xiàng)目改造通常分為以下兩步:
- 新增
scf_bootstrap
啟動(dòng)文件止后。 - 修改監(jiān)聽地址與端口為
0.0.0.0:9000
。
- 修改啟動(dòng)文件
main.ts
溜腐,監(jiān)聽端口改為9000
:
- 在項(xiàng)目根目錄下新建
scf_bootstrap
啟動(dòng)文件译株,在該文件添加如下內(nèi)容(用于啟動(dòng)服務(wù)):
您也可以在控制臺(tái)完成該模塊配置。
# scf_bootstrap
#!/bin/bash
SERVERLESS=1 /var/lang/node12/bin/node ./dist/main.js
新建完成后挺益,還需執(zhí)行以下命令修改文件可執(zhí)行權(quán)限歉糜,默認(rèn)需要 777 或 755 權(quán)限才可正常啟動(dòng)。示例如下:
chmod 777 scf_bootstrap
本地配置完成后望众,執(zhí)行啟動(dòng)文件匪补,確保您的服務(wù)可以本地正常啟動(dòng),接下來烂翰,登錄 Serverless 應(yīng)用控制臺(tái)夯缺,選擇Web 應(yīng)用>Nest.js 框架,上傳方式可以選擇本地上傳或代碼倉庫拉取
注意:啟動(dòng)文件以項(xiàng)目內(nèi)文件為準(zhǔn)甘耿,如果您的項(xiàng)目里已經(jīng)包含 scf_bootstrap 文件踊兜,將不會(huì)覆蓋該內(nèi)容。
單個(gè)函數(shù)代碼體積 500mb 的上限佳恬。在實(shí)際操作中捏境,云函數(shù)雖然提供了 500mb
關(guān)于繞過配額問題:
如果超的不多,那么使用 npm install --production
就能解決問題