性能测试上docker
在服务器上部署,需要做什么呢?
项目配置
- 增加docker文件
- 增加pm2, 在package.json中的scripts中增加
"pm2": "pm2 startOrReload --no-daemon pm2.json"
- 增加docker文件夹,内部创建Dockerfile、start.sh
- 增加pm2, 在package.json中的scripts中增加
# Dockerfile 文件
FROM xxx
WORKDIR xxx #设置工作路径
# 一系列copy动作
COPY 项目的路径 docker中的路径
# 安装git, 创建文件,设置文件权限
RUN apk add --no-cache git \
&& mkdir /apps/logs/ \
&& chown -R node:node /apps/logs/ \
&& yarn \
&& chmod +x /start.sh \
&& chown -R node:node /tmp
CMD ["/start.sh"]
# start.sh文件
#!/bin/sh
# 根据环境不同设置传入参数CONF_NAME
# 启动pm2
npm run pm2 --conf=/apps/conf/${CONF_NAME}
打镜像,测试机,推tag
- docker build -t tagName -f docker/Dockerfile .
- docker run -it -v 实际挂载路径:docker内部使用的路径 tagName
配置文件
- 在不同环境使用不同的配置文件,配置文件的格式可以自己定义,然后在server启动的时候读取配置文件
开机启动
- docker-compose.yml
version: '3'
services:
services_name:
image: tagName
container_name: container_name
user: root # 用户启动身份
restart: always # 跟随docker服务重启
environment: # 环境变量
- HOST=${JMETER_PUBLISH_HOST}
volumes: # 挂载变量
- xxxx:/apps/conf/online.conf
- xxxx:/home/works/saas-performance-material-hub
ports: # 端口映射
- 65534:65534
- 8001:8001
- Redis 部署
- 直接在上面的docker-compose文件中增加redis的配置
测试验证
项目运行之后,如何去查看log:docker exec -it container-id bash/sh
项目开发中的问题
- 项目中需要操作的文件,加一个:如果不存在,先创建,保障项目的可用性
- 项目中一定要有一个全局的try catch,一定要有app和process的
app.on('error', (err) => {
console.error(`app.error出现错误,${err.message}`)
})
process.on('uncaughtException', (err) => {
console.error(`uncaughtException出现异常,${err.message}`)
})
- 项目中的redis一定要增加重试机制
options.retry_strategy = (options) => {
// 前5次1分钟重连一次 超过五次,5分钟重连一次
let retryInterval = 1000 * 60
if (options.times_connected > 5) {
retryInterval *= 5
}
console.log(`---redis 正在尝试重连, ${retryInterval / (1000 * 60)}分钟之后重连`)
return retryInterval
}
- js文件中的websocket的地址写成灵活的,不能写成死的
- 一定要打出详细的log,以后好排查问题
遇到的问题
- 项目中有获取ip的操作,在docker中获取不到正确的ip,可以选择使用环境变量的形式传进去
- docker虽然类似linux,但base的docker不一样的话,可能存在命令不存在的情况。刚开始在项目中使用curl命令,在本机调试的时候正常,但是部署上去不可以了,进入docker查看后,发现不存在curl命令
- 镜像导出导入的问题
docker save tag_id > filename.tar
wget -P /保存文件的目录 文件下载地址
docker load < filename.tar
docker tag tag_id xxxxx # 修改tag名字
- docker开机自启动
systemctl enable docker.service
# 启动docker-compose中的服务
vim /etc/rc.d/rc.local
/usr/local/bin/docker-compose -f /www/docker/trace_fecshop/docker-compose.yml up -d
- docker中的权限问题,这是一个很头疼的问题。即使相同的权限,在不同的机器有的能起来有的起不来。相同的docker在不同机器上启动情况不一样,可能是文件权限的问题。