前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker+Jenkins+GIT+Tomcat实战持续化集成

Docker+Jenkins+GIT+Tomcat实战持续化集成

原创
作者头像
KaliArch
修改于 2018-04-22 12:53:35
修改于 2018-04-22 12:53:35
1.9K1
举报
文章被收录于专栏:KaliArchKaliArch

Docker基础教程可参考:容器Docker详解

Jenkins基础知识可参考:jenkins笔记(1)

Git基础知识可参考:GIT笔记

文件脚本内容参考:junsansi,可以根据实际项目具体修改脚本。

一、概要

开发将源码上传到github仓库,通过jenkins持续集成引擎结合git工具,将源码拉取到jenkins服务器,通过工具maven在本地讲源码编译打包成war包,在ssh到Docker宿主机,通过执行脚本生成制作自定义的Dockerfile,最终执行生成images,并启动container,即启动了包含war包的tomcat,即可实现对外提供web服务。

二、环境部署

| 主机名 | IP地址 |作用

| -------- | -------- |

| Docker-server | 172.20.6.20 |Docker宿主机

|Jenkins-server | 172.20.6.22 | Jenkins服务器

2.1 Jenkins服务器配置

Jenkins的安装及配置Jenkins服务器的相关工具(maven、git、ssh)配置,详细步骤可参考jenkins笔记(1)的相关工具的安装及配置。

2.2 Docker宿主机配置

Docker的基础命令可参考容器Docker详解,需要在Docker宿主机pull下tomcat的基础环境以及jenkins服务器通过docker用户登录Docker宿主机,讲war包发布到制定目录,执行特定脚本来生成Dockerfile,最终根据Dockerfile生成images,并启动基于包含war包的container,从而实现对外提供WEB服务。

创建ssh发布用户及目录

代码语言:txt
AI代码解释
复制
useradd docker
echo "docker:docker" |chpasswd      #为docker用户设置密码
mkdir -pv /data/dockerfiles/scripts

上传脚本

将脚本上传到 /data/dockerfiles/scripts,命名为devops,此名称可自定义,但是之后在配置jenkins执行ssh命令时候的脚本名称需要一致。由于脚本内部的分发路径是写的绝对路径,所以需要讲目录为固定,也可以根据实际修改。此脚本author:junsansi,可以参考其进行修改。

代码语言:txt
AI代码解释
复制
cat >/data/dockerfiles/scripts/devops.sh<<EOF
#!/bin/bash
# this script function is :                
# deploy new docker container             
#                                          
# USER        YYYY-MM-DD - ACTION          
# junsansi    2016-01-25 - CREATED        
parasnum=5
# function
help_msg()
{
cat << help
+ Error Cause:
+ you enter $# parameters
+ the total paramenter number must be $parasnum
+ 1st :DOCKER_NAME
+ 2nd :PROJECT_NAME
+ 3rd :PROJECT_VERSION
+ 4th :SOURCE_PORT
+ 5th :DESTINATION_PORT
help
}
# Check parameter number
if [ $# -ne ${parasnum} ]
then
        help_msg 
        exit
fi
# Initialize the parameter.
DOCKER_NAME=$1
PROJECT_NAME=$2
PROJ_VERSION=$3
SPORT=$4
DPORT=$5
PROJ_VERSION=${PROJ_VERSION/"origin/"/""}
DOCKER_FILE="/data/dockerfiles/${DOCKER_NAME}/Dockerfile"
DOCKER_FILE_DIR=/data/dockerfiles/${DOCKER_NAME}
if [ ! -d ${DOCKER_FILE_DIR} ]; then
        mkdir -p ${DOCKER_FILE_DIR}
fi
# check docker images
DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'`
if [ -n "${DOCKER_IMAGE}" ]; then
        # check docker container
        for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'`
        do
                echo "Stop container: ${dc}"
                /usr/bin/docker stop ${dc}
                # delete while docker container was exists
                echo "##Delete exists Container_Id: "${dc}
                /usr/bin/docker rm ${dc}
        done

        # delete while docker image was exists
        echo "#Delete exists Image: "${DOCKER_IMAGE}
        /usr/bin/docker rmi ${DOCKER_IMAGE} 
fi
# Init dockerfile
echo "**Init dockerfile start: "${DOCKER_FILE}
echo "FROM tomcat" > ${DOCKER_FILE}
echo 'MAINTAINER junsansi "junsansi@sina.com"' >> ${DOCKER_FILE}
echo "ADD *.war /usr/local/tomcat/webapps/${PROJECT_NAME}.war" >> ${DOCKER_FILE}
echo "EXPOSE 8080" >> ${DOCKER_FILE}
echo "CMD /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out" >> ${DOCKER_FILE}
cat ${DOCKER_FILE}
echo "**Init dockerfile end."
# Build dockerfile
cd ${DOCKER_FILE_DIR}
rm *.war -rf
mv /data/dockerfiles/war/${DOCKER_NAME}/*.war ./
echo ""
echo "##Build dockerfile for "${DOCKER_NAME}
/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . 
# Run docker container
echo ""
echo "##Running docker container: "${DOCKER_NAME}
/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION}
EOF
chmod +x  /data/dockerfiles/scripts/devops.sh
chown docker.docker /data/dockerfiles -R

Docker宿主机获取tomcat镜像

docker pull docker.io/tomcat

使用docker images查看tomcat镜像

此时Docker宿主机就已经配置完毕。

三、Jenkins配置

登录Jenkins的WEB界面

3.1 配置Docker宿主机的ssh信息

系统管理---系统设置---Publish over SSH---增加SSH Server

添加SSH Server可以使用密钥形式添加,也可以直接使用用户名密码, 此处使用用户名密码,选择

Use password authentication, or use a different key,即docker用户的密码,进行登录发布,之前已经讲/data/dockerfiles目录的属主属组更改为docker,确认Jenkins服务器使用docker用户可以正常在此目录下进行后续操作。

3.2 构建一个maven项目

一般设置

为保证Jenkins服务器的磁盘有充足的空间,在选中丢弃旧的构建->保持构建的最大个数为10个

在真实开发环境中,成员直接相互协助,GIT是多分支的,考虑到分支管理,需在此选中参数化构建->选择Git Parameter->定义名称为release_branch,因此选择参数类型为Branch:如果自己发现devops脚本可以看到里面是调用了此参数进行选择构建的分支。

同时创建考虑到创建Docker的名称,此时需要给后续创建的docker images以项目的名称命名。

源码管理

源码管理选择git,填入仓库url:git@github.com:redhatxl/zrlog.git

此时发现会出现报错信息,因为此仓库为我的私有仓库,需要配置Credentials,点开add, Add Credentials的 Kind选择SSH Username with private key,Username选择之前在github上传的公钥用户的用户名,此次为root,Private Key为jenkins服务器登录github的本地私钥,查看私钥cat /root/.ssh/id_rsa 复制粘贴到Key区域,完成添加。此时可以发现报错已经消失。

在Branches to build模块需要填写之前我们参数话的变量,在此引用$release_branch

环境构建

在build的Goals and options添加maven构建参考及命令:clean install -D maven.test.skip=true

增加构建后操作

增加构建后步骤---选择Send build artifacts over SSH

SSH-Server name选择Docker宿主机

Transfers中填写Source files:target/*.war

Remove prefix:target/

Remote directory:/war/$project_name,即在远端/data/dockerfiles下的war目录(/data/dockerfiles/war/docker01-tomcat-zrlog)

Exec command:/data/dockerfiles/scripts/devop.sh $project_name zrlog $release_branch 8888 8080

即jenkins服务器ssh到docker宿主机之后执行的脚本命令,执行/data/dockerfiles/scripts/devop.sh脚本,此脚本需要传入5个参考,

project_name:项目名称,即docker生成images的名称

zrlog:即项目名称

release_branch:在git上提交的分支,此处我们只有master分支

两个端口,前一个端口及宿主机的监听端口,后一个端口及映射到docker容器内部的端口,在此处使用的为tomcat,默认的为8080端口。

注意:再次可以添加多个server,即实现集群,可以讲web服务器为无状态,将日志文件挂载到本地物理磁盘以实现日志监控即数据持久化存储。

添加增加构建后操作,选择Editable Email Notification,利用插件邮件来发送通知。

可以根据需求自定义邮件主题与内容,此处添加信息接受人,由于全局配置了always,在高级设置内,填写接受人邮箱。

创建完毕后点击应用并保存。

3.3 执行构建

选择Build with Parameters,然后在右边release_branch内选择需要执行的github上的分支,此处为master,同理选择 project_name,为docker images的name可以选择自己添加自定义的名字,点击开始构建

查看Console Output

查看邮件通知

登录docker宿主机查看images与container

网页测试

至此利用jenkins简单的实现了讲github上的源码拉去到jenkins服务器本地,利用maven编译生成war包并分发到docker宿主机,执行脚本生成dockerfile,并启动容器,最终邮件通知。

四、启动多个容器

在配置jenkins的ssh后的命令我们可以添加多个server从而实现分布式,同时我们也可以对在一台主机上通过区分端口号来生成多个images并启动多个不通端口的container

在General的参数化构建过程中增加第三个参数proxy_port可以设置为docker宿主机的本地监听端口从而实现多端口多实例

在ssh命令中调用

在构建开始时可以定义不同的images对应不通的端口

查看启动后的容器

注意:如果有特殊需求,例如发布php代码或其他可以自行对脚本进行修改,可以根据需求定义多个参数灵活使用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
作者的GIT笔记不错,文章写得也很详细,阅读性很强
作者的GIT笔记不错,文章写得也很详细,阅读性很强
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Docker+Jenkins+Gitlab+Django应用部署实践
在互联网应用快速更新迭代的大背景下,传统的人工手动或简单脚本已经不能适应此变化,此时Devops为我们提供了良好的解决方案,应用好CI/CD可以大大的方便我们的日常工作,自动化快速的持续集成/持续交付为我们带来了应用开放的更快速度、更好的稳定性和更强的可靠性。
KaliArch
2019/01/01
1.5K0
Docker+Jenkins+Gitlab+Django应用部署实践
【玩转腾讯云】记一次容器服务日志处理过程
在目前小程序为主的大背景下,有客户大部分业务在腾讯云,使用的大部分为容器服务,在大规模的使用容器下,需要对容器内业务的日志采集及分析,在腾讯云对应容器服务的日志提供了两种消费方式:Kafka、日志服务CLS。
KaliArch
2021/04/23
8120
【玩转腾讯云】记一次容器服务日志处理过程
大数据平台CDH搭建
Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称“CDH”),基于Web的用户界面,支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop,简化了大数据平台的安装、使用难度。
KaliArch
2018/06/01
5.5K0
大数据平台CDH搭建
大数据平台HDP搭建
在ambari的setup中我们可以选择使用默认的postgresql,也可以自定义使用其他数据库,此处选用mariadb,便于后期管理维护
KaliArch
2018/05/29
2.5K3
大数据平台HDP搭建
HTTP 协议Note
名称含义:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。
KaliArch
2018/06/24
4290
HTTP 协议Note
Kubernetes+Prometheus+Grafana部署笔记
Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台。Kubernetes通常结合docker容器工具工作,并且整合多个运行着docker容器的主机集群,Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
KaliArch
2018/08/16
1.9K0
Kubernetes+Prometheus+Grafana部署笔记
Serverless初探
无服务器计算是指开发者在构建和运行应用时无需管理服务器等基础设施,应用被解耦为细粒度的函数,函数是部署和运行的基本单位。用户只为实际使用的资源付费。这些代码完全由事件触发(event-trigger),平台根据请求自动平行调整服务资源,拥有近乎无限的扩容能力,空闲时则没有任何资源在运行。代码运行无状态,可以轻易实现快速迭代、极速部署。
KaliArch
2018/08/31
11.3K0
Serverless初探
prometheus 告警
告警能力在Prometheus的架构中被划分成两个独立的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。
张琳兮
2020/02/07
6.2K4
hadoop完全分布式部署
是一个框架,允许跨越计算机集群的大数据及分布式处理,使用简单的编程模型(mapreduce)
KaliArch
2018/05/23
8531
hadoop完全分布式部署
Hadoop2.6+Zookper3.4+Hbase1.0部署安装
修改hbase-env.sh,添加java环境变量和生命使用外部zookeeper
KaliArch
2018/05/23
4030
Hadoop2.6+Zookper3.4+Hbase1.0部署安装
Linux系统进程CPU使用率限制脚本
一、背景 近日在客户系统运维中发现,有系统在定时脚本执行期间会将Linux系统CPU利用率跑满,导致其他服务受到影响,故查阅资料发现有大神写的CPU利用率限制程序。 地址:CPU Usage Limiter for Linux 根据此编写脚本,配合定时任务放置在服务器上,达到限制程序CPU情况,可根据自己系统CPU核心数进行参数配置,会记录CPU超过阀值的日志,可供后期进行查看分析。 二、脚本 GIT地址:cpulimit.sh #!/bin/bash # auth:kaliarch # func:sys
KaliArch
2018/11/16
3.5K0
Linux系统进程CPU使用率限制脚本
ZABBIX监控每秒业务状态
有客户监控MySQL的公网延迟,细粒度到每秒,对你没听错是每秒,云平台级别的监控阿里云/腾讯云虽都支持自定义监控,但是限于数据的存储,粒度最小为每一分钟,阿里云免费云监控频率是5分钟,收费的粒度才可调至1分钟,对此想到利用ZABBIX来进行每一秒的数据上报,最终利用其绘图来进行展示。在此抛砖引玉,其他自定义监控均为此类方法,只需要简单修改脚本获取到需要上报的值即可。
KaliArch
2018/08/28
2.1K0
ZABBIX监控每秒业务状态
Python实现端口检测
在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等web扫描端口等。
KaliArch
2018/07/24
2.2K0
Python实现端口检测
Python构建企业微信自动消息转发服务端
目前有在项目分组,就小组成员中,微信群消息回复较多的情况下,想根据组来转发特定消息,包含文字、图片、语言等。在此只是自己实现仅供参考,可以根据自身需求修改更多功能。
KaliArch
2018/08/10
3.4K0
Python构建企业微信自动消息转发服务端
docker 挂载文件不同步问题记录
# docker 挂载文件不同步问题记录 ```bash 作者: 张首富 时间: 2020-05-09 晚 w x: y18163201 ``` ## 起因 今天上午开发给我反应一个问题,所在宿主机
张琳兮
2020/05/09
4.2K1
Python利用sphinx构建个人博客
一、基础概念 利用sphinx+pandoc+github+readthedocs构建个人博客 Sphinx: 是一个基于ReStructuredText的文档生成工具,可以令人轻松的撰写出清晰且优美的文档, 由Georg Brandl在BSD许可证下开发。新版的Python文档就是由Sphinx生成的,并且它已成为Python项目首选的文档工具,同时它对C/C++项目也有很好的支持;并计划对其它开发语言添加特殊支持。 Read the Docs是一个在线文档托管服务,可以从各种版本控制系统中导入文档。支持
KaliArch
2018/10/31
2.3K1
Python利用sphinx构建个人博客
Python实现翻译小工具
利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面。
KaliArch
2018/06/05
8845
Python实现翻译小工具
Python字符串,列表
字符串: 字符串的创建: 单引号, 双引号 ,三引号 <注意: 转义字符的使用> 字符串的特殊性: 索引 切片 连接 重复 成员操作符(in, not in)
py3study
2020/01/14
1K0
Python构建私有代理IP库
至此我们就利用Python构建了一个属于自己的私有代理库,在进行爬去的时候可方便从数据库中获取使用。
KaliArch
2018/04/21
2.9K5
Python构建私有代理IP库
快捷安装不同版本Python
一、目的 日常测试中,为快捷在Linux系统下安装不同版本Python并安装pip。 二、脚本 #!/bin/bash #mail:xuel@anchnet.com #function:auto install python sys_init() { [ -f /etc/init.d/functions ] && . /etc/init.d/functions [ $(id -u) != "0" ] && echo "Error: You must be root to run this script" &
KaliArch
2018/07/04
5900
快捷安装不同版本Python
相关推荐
Docker+Jenkins+Gitlab+Django应用部署实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档