【轉】Jenkins集成Docker鏡像實現自動發布


1. 思路&流程

Jenkins集成Docker鏡像實現自動發布與Jenkins發布mavne項目思路一樣總體流程 為:
Jenkins 拉去遠端源碼 —— gitl
實現應用打包 —— jenkins本地
把應用程序打包進Docker鏡像 —— Dockerfile
鏡像上傳到Docker私有倉庫 —— shell或者 Docker相關的Jekins插件
刪除老的Docker容器,運行新的Docker容器 —— shell腳本

2. 環境准備

Jenkins java maven Docker git git-Jenkins插件
配置Jenkins
Git倉庫可以開啟鈎子功能實現push代碼后自動觸發Jenkins構建功能,如需要可以在git倉庫中開啟此功能。
新建項目 選擇mavan風格項目或者自由風格項目(這里使用自由風格)

clipboard.png

3. 配置Jenkins構建觸發器

clipboard.png

說明1:觸發遠程構建 (例如,使用腳本) 這個選項就是上面提到配合git倉庫的鈎子功能實現代碼PUSH后Jenkins收到通知自動觸發構建項目的動作 說明2:Poll SCM日程表 定時檢查源碼變更,如果有更新就克隆下最新code下來,然后執行構建動作 

clipboard.png

5分鍾檢查一次該項目分支是否有變動,如果有就拉去最新code執行構建動作 注:構建觸發器這里我們不做任何選擇,這里只是介紹這兩周功能,如有需要自行實現。 

4. 構建日志輸出

clipboard.png

查看docker本地倉庫

 

 

鏡像已經存在

 

 

容器已經在運行了

clipboard.png

項目中的Dockerfile

Git倉庫的項目當中需要存放Dockerfie文件,用於打包應用到鏡像里面

5. Dockerfile內容如下:

clipboard.png

為了避免構建過程過多時間執行過長,Dockerfile文件只做了一件事就是把Jenkins打包好的應用文件添加進容器里。其他所需的環境和操作都將在基礎鏡像上完成,提高構建效率。
注:這里的 FROM java6是需要存在在Docker本地倉庫上的鏡像,如果不存在Jekins在執行構建過程中回去Docker Hub上拉取對應鏡像,如果沒有則會報錯。

6.基礎鏡像 Dockerfile

clipboard.png

Java6的鏡像是從這里由來,添加了tomcat以及JAVA環境變量 構建Docker鏡像這里只做一下簡單說明

我的dockerfile文件如下:

 FROM是一個打包好的基礎鏡像,每次都使用這個鏡像加入不同的應用,再打包成新鏡像。

 

 

 

 

Jenkins構建后操作
Jekins可以使用相關的Docker插件來實現此功能,但由於外網被牆安裝困難,這里采用Execute Shell方式實現,也比較簡單易於后期維護。

 

 #登錄到docker所在服務器上執行命令

ssh root@xxx.xxx.xxx.xxx "
ip addr
imagesid=\$(docker images | grep -i dpi | awk '{print \$3}')
#如果imagesid不為空,則刪掉該image和container,保證每次都重新打包成新的image鏡像
if [ -z \"$imagesid\" ]; then
    echo \$imagesid \"is null\"
else
    name=\$(docker images | grep -i dpi | awk '{print \$1}')
    tag=\$(docker images | grep -i dpi | awk '{print \$2}')
    nametag=\$name:\$tag
    echo \$nametag
    containerid=\$(docker ps| grep \$nametag | awk '{print \$1}')
    echo \"lrx \$containerid\"
    docker rm \$containerid -f
    docker rmi \$imagesid -f
fi
#從當前執行目錄推到dockerfile文件的路徑,dockerfile必須在docker所在服務器上
pushd /dockerdir
pwd
#執行dockerfile文件生成新的鏡像,並給鏡像打標簽
docker build -t dpi:1.0 .
#跳回到當前執行目錄
popd
pwd
#開啟docker容器
docker container run -d -u root --name jar -h app29 --network host --privileged --cap-add=NET_ADMIN dpi:1.0;
"

 

注:這里的殺掉老的容器和刪除舊的容器 grep的都是通過容器的名稱所匹配的,所以再啟動啟動容器的時候要指定容器名稱 –name,否則就是啟動失敗。

7. 頁面訪問驗證

 

 

我Docker鏡像里的應用就是一個index頁面,容器訪問成功。

8. 擴展

- 多節點升級

以上只是針對單節點本機Docker的打包部署方式,如需要多借點部署,不用多次編譯構建,只需執行一次構建操作,把鏡像上傳到企業內部私有倉庫,通過ansibles 實現多節點部署。

- Docker集群環境的部署方式

使用kubernets集群管理工具通過Deployment(1.2版本新增)文件實現滾動升級容器(等同於應用的部署)

 

以上轉自https://segmentfault.com/a/1190000007837054


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM