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代碼或其餘能夠自行對腳本進行修改,能夠根據需求定義多個參數靈活使用