前言
关于RAP我有介绍过:https://www.jianshu.com/p/fc1c97eb109c
rap2来为团队提供接口管理服务,从而提高开发团队效率。部署过程中遇到很多问题,在此做一总结,一为总结自己在部署过程中的收获,二为需要部署rap2的同行提供一点参考。
此前尝试过手动部署阿里的RAP2,虽然部署成功了,但是部署过程一路曲折,填了很多坑,并且官网也说了,利用docker可以很让前后端轻易的跟随主项目升级(实际亲测手动部署在升级项目体验上效果不佳,特别是升级更新代码后,后端数据库表的改动让人无可奈何,手动部署也就意味着很多东西在原有的基础上需要自己手动更新,很不方便。。),既然是为了方便而方便,那我们肯定更需要的是快速部署,快速使用它。使用docker就是一条捷径。
想手动部署可以参考项目文档:
前端部署:https://github.com/thx/rap2-dolores
后端部署:https://github.com/thx/rap2-delos
docker 快速部署(内部已集成前后端代码一键部署):
什么是docker ?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1.首先,需要安装 Docker 和 Docker Compose(这里只演示在linux上安装)
国内用户可参考 https://get.daocloud.io/ 安装 Docker 以及 Docker Compose (Linux 用户需要单独安装),建议按照链接指引配置 Docker Hub 的国内镜像提高加载速度。
【安装Docker 】
curl -sSL https://get.daocloud.io/docker | sh
【安装Docker Compose】
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2.创建项目文件目录进入文件目录(这里只是举个栗子,想放哪里放哪里,例如下面这样)
mkdir /root/rap2
cd /root/rap2
3.复制rap2-dolores仓库中的 docker-compose.yml的文件代码(这个是本项目的docker镜像配置文件)到 rap2 目录中
我这里复制一份出来(最好到仓库里面去复制,以最新的配置文件为准)
# mail@dongguochao.com
# llitfkitfk@gmail.com
# chibing.fy@alibaba-inc.com
version: "3"
services:
# frontend
dolores:
image: rapteam/rap2-dolores:latest
ports:
#冒号前可以自定义前端端口号,冒号后不要动
- 3000:38081
# backend
delos:
image: rapteam/rap2-delos:latest
ports:
# 这里的配置不要改哦
- 38080:38080
environment:
- SERVE_PORT=38080
# if you have your own mysql, config it here, and disable the 'mysql' config blow
- MYSQL_URL=mysql # links will maintain /etc/hosts, just use 'container_name'
- MYSQL_PORT=3306
- MYSQL_USERNAME=root
- MYSQL_PASSWD=
- MYSQL_SCHEMA=rap2
# redis config
- REDIS_URL=redis
- REDIS_PORT=6379
# production / development
- NODE_ENV=production
###### 'sleep 30 && node scripts/init' will drop the tables
###### RUN ONLY ONCE THEN REMOVE 'sleep 30 && node scripts/init'
command: /bin/sh -c 'node dispatch.js'
# init the databases
# command: sleep 30 && node scripts/init && node dispatch.js
# without init
# command: node dispatch.js
depends_on:
- redis
- mysql
redis:
image: redis:4
# disable this if you have your own mysql
mysql:
image: mysql:5.7
# expose 33306 to client (navicat)
#ports:
# - 33306:3306
volumes:
# change './docker/mysql/volume' to your own path
# WARNING: without this line, your data will be lost.
- "./docker/mysql/volume:/var/lib/mysql"
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES utf8mb4;' --innodb-flush-log-at-trx-commit=0
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
MYSQL_DATABASE: "rap2"
MYSQL_USER: "root"
MYSQL_PASSWORD: ""
项目是前后端分离的,这里可以配置一下前端访问的端口号,端口号默认3000,可以自己改
ports:
#冒号前可以自定义前端端口号,冒号后不要动
- 3000:38081
如果需要开启远程访问数据库,这里需要把注释去掉,数据库端口号默认33306,可以自己改
# expose 33306 to client (navicat)
ports:
- 33306:3306 //映射镜像3306端口到本地服务器33306端口
安全性:(特别注意)
若开启远程访问数据库,请注意默认镜像配置的数据库访问无需密码即可进入,导致了隐患。
这里需要在docker-compose.yml的mysql下配置MYSQL_PASSWORD,配置完毕后会在下面步骤初始化生成该项目镜像的时候自动创建该项目的数据库密码
# disable this if you have your own mysql(有自己的数据库账号密码的可以省略,我建议初始化重新创建不要省略,毕竟是作为一个单独项目数据库安全性更高,这个项目存储的数据价值不大,只是用来模拟接口,即使被脱裤也影响不到其他项目。。)
mysql:
......省略一些配置
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true" //是否允许空密码,这里建议改成false
MYSQL_DATABASE: "rap2" //初始化数据库名
MYSQL_USER: "root" //初始化数据库用户名
MYSQL_PASSWORD: "" //这里配置你要初始化的数据库的密码,不要放空
配置mysql配置后还需要告诉后端项目用的哪个账户登录数据库:
# backend
delos:
......省略一些配置
# if you have your own mysql, config it here, and disable the 'mysql' config blow
- MYSQL_URL=mysql # links will maintain /etc/hosts, just use 'container_name'
- MYSQL_PORT=3306 //镜像中mysql使用的端口号
- MYSQL_USERNAME=root //镜像中mysql使用的用户名
- MYSQL_PASSWD= //镜像中mysql使用的用户密码,不要放空
- MYSQL_SCHEMA=rap2 //镜像中mysql使用的数据库名称
以上配置都不要放空,改成与刚刚mysql配置对应的信息,一定要正确对应否则项目启动后后端服务无法正常访问数据库。
配置文件修改完毕后,我们拷贝放入之前创建的文件夹里
cd /root/rap2
vi docker-compose.yml //创建文件
vim docker-compose.yml //编辑它,按i箭开启编辑状态,将改过的配置文件代码复制进去
按esc关闭编辑状态
:wq //强制保存文件并退出
4.拉取镜像并启动(第一次会根据上面配置的文件下载镜像到该目录下,比较慢,耐心等待。。。)
docker-compose up -d
5.启动后,第一次运行需要手动初始化mysql数据库(项目会导入表结构和一些虚拟数据进行自动化测试以确保数据库能正常使用)
# ⚠️注意: 只有第一次该这样做(若项目已有用户数据的情况千万不要执行,数据库会被清空覆盖)
docker-compose exec delos node scripts/init
6.部署成功后 愉快的访问:
http://localhost:3000 # 前端(你刚配置的前端端口号)
能访问到说明前端访问正常,
再注册一个账号试试看,若能注册成功代表后端服务正常,并且数据库已经可以正常愉快的使用了。
7.访问不了的情况
可能是数据库没有链接上,关闭 rap 服务
docker-compose down
再重新运行
docker-compose up -d
8.报错排查
如果 Sequelize 报错可能是数据库表发生了变化,运行下面命令同步
docker-compose exec delos node scripts/updateSchema
如果 port is already allocated 提示端口已存在
https://www.cnblogs.com/typttxs/p/10764640.html
9.镜像升级
Rap 经常会进行 bugfix 和功能升级,用 Docker 可以很方便地跟随主项目升级
拉取一下最新的镜像
docker-compose pull
暂停当前应用
docker-compose down
重新构建并启动
docker-compose up -d --build
有时表结构会发生变化,执行下面命令同步
docker-compose exec delos node scripts/updateSchema
清空不被使用的虚悬镜像
docker image prune -f
10.补充
使用docker images可以查看本机的所有镜像
若数据库远程访问端口开启后会从该镜像创建数据库的映射到服务器本地与数据库联通。我们可以通过docker ps 查看镜像容器看到
参考文章:
https://blog.csdn.net/EHOIST/article/details/94628714
https://www.cnblogs.com/typttxs/p/10764640.html
https://blog.csdn.net/weixin_42459563/article/details/80924634
https://www.itsvse.com/thread-5166-1-1.html