1、概要

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

2、环境部署

主机名 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)的相关工具的安装及配置。git

2.2 Docker宿主机配置

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

建立ssh发布用户及目录web

useradd docker
echo "docker:docker" |chpasswd #为docker用户设置密码 mkdir -pv /data/dockerfiles/scripts

上传脚本docker

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

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镜像bash

docker pull docker.io/tomcat
使用docker images查看tomcat镜像
Docker+Jenkins+GIT+Tomcat实战持续化集成
此时Docker宿主机就已经配置完毕。服务器

3、Jenkins配置

登陆Jenkins的WEB界面app

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用户能够正常在此目录下进行后续操做。
Docker+Jenkins+GIT+Tomcat实战持续化集成ssh

3.2 构建一个maven项目

通常设置

Docker+Jenkins+GIT+Tomcat实战持续化集成
为保证Jenkins服务器的磁盘有充足的空间,在选中丢弃旧的构建->保持构建的最大个数为10个
Docker+Jenkins+GIT+Tomcat实战持续化集成
在真实开发环境中,成员直接相互协助,GIT是多分支的,考虑到分支管理,需在此选中参数化构建->选择Git Parameter->定义名称为release_branch,所以选择参数类型为Branch:若是本身发现devops脚本能够看到里面是调用了此参数进行选择构建的分支。
同时建立考虑到建立Docker的名称,此时须要给后续建立的docker images以项目的名称命名。
Docker+Jenkins+GIT+Tomcat实战持续化集成

源码管理

源码管理选择git,填入仓库url:git@github.com:redhatxl/zrlog.git
Docker+Jenkins+GIT+Tomcat实战持续化集成
此时发现会出现报错信息,由于此仓库为个人私有仓库,须要配置Credentials,点开add, Add Credentials的 Kind选择SSH Username with private key,Username选择以前在github上传的公钥用户的用户名,这次为root,Private Key为jenkins服务器登陆github的本地私钥,查看私钥cat /root/.ssh/id_rsa 复制粘贴到Key区域,完成添加。此时能够发现报错已经消失。
Docker+Jenkins+GIT+Tomcat实战持续化集成
在Branches to build模块须要填写以前咱们参数话的变量,在此引用$release_branch
Docker+Jenkins+GIT+Tomcat实战持续化集成

环境构建

在build的Goals and options添加maven构建参考及命令:clean install -D maven.test.skip=true
Docker+Jenkins+GIT+Tomcat实战持续化集成

增长构建后操做

增长构建后步骤---选择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端口。
Docker+Jenkins+GIT+Tomcat实战持续化集成
注意:再次能够添加多个server,即实现集群,能够讲web服务器为无状态,将日志文件挂载到本地物理磁盘以实现日志监控即数据持久化存储。

添加增长构建后操做,选择Editable Email Notification,利用插件邮件来发送通知。
能够根据需求自定义邮件主题与内容,此处添加信息接受人,因为全局配置了always,在高级设置内,填写接受人邮箱。
Docker+Jenkins+GIT+Tomcat实战持续化集成
建立完毕后点击应用并保存。

3.3 执行构建

选择Build with Parameters,而后在右边release_branch内选择须要执行的github上的分支,此处为master,同理选择 project_name,为docker images的name能够选择本身添加自定义的名字,点击开始构建
Docker+Jenkins+GIT+Tomcat实战持续化集成
查看Console Output
Docker+Jenkins+GIT+Tomcat实战持续化集成
Docker+Jenkins+GIT+Tomcat实战持续化集成
查看邮件通知
Docker+Jenkins+GIT+Tomcat实战持续化集成
登陆docker宿主机查看images与container
Docker+Jenkins+GIT+Tomcat实战持续化集成
网页测试
Docker+Jenkins+GIT+Tomcat实战持续化集成
至此利用jenkins简单的实现了讲github上的源码拉去到jenkins服务器本地,利用maven编译生成war包并分发到docker宿主机,执行脚本生成dockerfile,并启动容器,最终邮件通知。

4、启动多个容器

在配置jenkins的ssh后的命令咱们能够添加多个server从而实现分布式,同时咱们也能够对在一台主机上经过区分端口号来生成多个images并启动多个不通端口的container
在General的参数化构建过程当中增长第三个参数proxy_port能够设置为docker宿主机的本地监听端口从而实现多端口多实例
Docker+Jenkins+GIT+Tomcat实战持续化集成
在ssh命令中调用
Docker+Jenkins+GIT+Tomcat实战持续化集成
在构建开始时能够定义不一样的images对应不通的端口
Docker+Jenkins+GIT+Tomcat实战持续化集成
查看启动后的容器
Docker+Jenkins+GIT+Tomcat实战持续化集成注意:若是有特殊需求,例如发布php代码或其余能够自行对脚本进行修改,能够根据需求定义多个参数灵活使用