Jenkins部署项目到Docker容器
背景
- 一个负责数据清洗的项目,以Kafka消费者的方式接受数据并处理。当消费数据数量过多时,要对项目进行性能优化。
- 优化方式:服务器通过部署多个项目增加项目进程的方式增加Kafka消费者的数量。每个进程里使用线程池异步做业务处理。
环境
- Ubuntu18
- Java8
- Jenkins
前置条件
- Jenkins安装完成
Jenkins配置关键点
- 上传项目jar包及Dockerfile文件到服务器
- 上传文件后,自动执行脚本文件
步骤
- 打开Jenkins页面,选择项目进行部署配置,基本配置网上一大把,这里只会详细说明Jenkins构建后操作,如下图
- 发送服务器文件(Source files): 项目打包完成,所有文件都会存在target目录下
- 项目jar包:项目构建的jar包
- Dockerfile文件:Docker构建镜像基本配置,这个文件位置,你可以自己决定,Dockerfile文件内容如下
# 该镜像需要依赖的基础镜像 FROM java:8 # COPY: 将应用的配置文件复制到docker容器的/目录下 # 此处作用:将当前目录下所有jar合并打包到docker根目录下,并重命名 app.jar # 此处名称自定义即可,如果只是使用一个jar包,那么*.jar 可以指定自己上传的jar包 COPY *.jar /app.jar # EXPOSE:声明端口 EXPOSE 8551 # 指定docker容器启动时运行jar包 # 此处运行的jar包名称,需要和上面重命名名称一致 ENTRYPOINT ["java", "-jar","/app.jar"] # 指定维护者的名字 MAINTAINER jingguoliang
- 上传文件后,服务器执行脚本(Exec Command),脚本内容如下
#!/bin/bash echo "上传远程服务器成功" #镜像名:自定义 imageNAME="cmms-receiver" #该端口为Docker宿主机端口:自定义 PORT=8551 #容器1:使用镜像包启动的容器名称,数量自定义,我是使用一个镜像启动3个容器 CONNAME1="cmms-receiver-2.0-RELEASE-1" #容器2 CONNAME2="cmms-receiver-2.0-RELEASE-2" #容器3 CONNAME3="cmms-receiver-2.0-RELEASE-3" pwd ls -l #切换到 /home/ubuntu/cmms/lib 目录 #此目录为jenkins打包后发送文件目录,目录结构如下 #cmms-receiver-2.0-RELEASE.jar #classes/Dockerfile cd /home/ubuntu/cmms/lib/receiver ls -l #复制Dockerfile到lib目录下 cp ./classes/Dockerfile ./Dockerfile echo "复制Dockerfile成功" ls -l #强制删除已有容器1 { # try docker rm -f ${CONNAME1} } || { # catch echo "容器1不存在" } #强制删除已有容器2 { # try docker rm -f ${CONNAME2} } || { # catch echo "容器2不存在" } #强制删除已有容器3 { # try docker rm -f ${CONNAME3} } || { # catch echo "容器3不存在" } #强制删除镜像 { # try docker image rm -f ${imageNAME} } || { # catch echo "镜像不存在" } #构建镜像 echo "开始构建镜像文件" docker build -t ${imageNAME} . echo "构筑镜像结束" #创建并运行容器1:参数-p 8111:{port} 其中8111是容器暴露端口,自定义即可 docker run --name ${CONNAME1} -d -p 8111:${PORT} -e "SPRING_PROFILES_ACTIVE=uat" ${imageNAME} echo "创建容器$CONNAME1成功" #创建并运行容器2 docker run --name ${CONNAME2} -d -p 8112:${PORT} -e "SPRING_PROFILES_ACTIVE=uat" ${imageNAME} echo "创建容器$CONNAME2成功" #创建并运行容器3 docker run --name ${CONNAME3} -d -p 8113:${PORT} -e "SPRING_PROFILES_ACTIVE=uat" ${imageNAME} echo "创建容器$CONNAME3成功"