您好,登錄后才能下訂單哦!
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服務器 |
Jenkins的安裝及配置Jenkins服務器的相關工具(maven、git、ssh)配置,詳細步驟可參考jenkins筆記(1)的相關工具的安裝及配置。
Docker的基礎命令可參考容器Docker詳解,需要在Docker宿主機pull下tomcat的基礎環境以及jenkins服務器通過docker用戶登錄Docker宿主機,講war包發布到制定目錄,執行特定腳本來生成Dockerfile,最終根據Dockerfile生成images,并啟動基于包含war包的container,從而實現對外提供WEB服務。
創建ssh發布用戶及目錄
useradd docker
echo "docker:docker" |chpasswd #為docker用戶設置密碼
mkdir -pv /data/dockerfiles/scripts
上傳腳本
將腳本上傳到 /data/dockerfiles/scripts,命名為devops,此名稱可自定義,但是之后在配置jenkins執行ssh命令時候的腳本名稱需要一致。由于腳本內部的分發路徑是寫的絕對路徑,所以需要講目錄為固定,也可以根據實際修改。此腳本author:junsansi,可以參考其進行修改。
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的WEB界面
系統管理---系統設置---Publish over SSH---增加SSH Server
添加SSH Server可以使用密鑰形式添加,也可以直接使用用戶名密碼, 此處使用用戶名密碼,選擇
Use password authentication, or use a different key,即docker用戶的密碼,進行登錄發布,之前已經講/data/dockerfiles
目錄的屬主屬組更改為docker,確認Jenkins服務器使用docker用戶可以正常在此目錄下進行后續操作。
一般設置
為保證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,在高級設置內,填寫接受人郵箱。
創建完畢后點擊應用并保存。
選擇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代碼或其他可以自行對腳本進行修改,可以根據需求定義多個參數靈活使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。