Docker決戰到底(五) 制作自己的Jenkins鏡像


前文導航
Docker決戰到底(一) 虛擬機中安裝ubuntu系統
Docker決戰到底(二) Docker環境搭建
Docker決戰到底(三) Rancher2.x的安裝與使用
Docker決戰到底(四) Jenkins的安裝與使用

一、前言概要

本篇實踐記錄主要圍繞制作一個自己的jenkins鏡像而展開,前提是需要你了解怎么制作一個鏡像,如果你還不了解,那么建議你先閱讀docker官方文檔 編寫Dockerfiles的最佳實踐 。 在 上一篇 中,我們從jenkins中構建的 restful-api-demo 也使用到了自己制作的Dockerfile,只是它是基於springboot開發的web應用來制作的,你也可以參考一下,在以后你自己開發類似應用服務時應該能用上。

docker決戰到底(四) Jenkins的安裝與使用 中,我們使用的是官方的jenkins/jenkins:alpine鏡像,啟動鏡像后還需要經過一系列操作,如我們對maven的安裝以及配置,這樣的操作可能你在另一台計算機上部署相同的jenkins時也需要做出同樣的操作,這時候我們就有必要制作一個自己的jenkins鏡像,把相同操作過程固定到鏡像中。當然,不只是針對jenkins,當有類似情況時,你應該學會舉一反三。

那么接下來,我們就開始編寫一個Dockerfile來制作jenkins鏡像,這個鏡像將會滿足如下功能:

  • 沿用官方jenkins/jenkins:alpine鏡像的所有功能
  • 能夠作為docker客戶端直接使用docker命令(共用宿主機docker.sock),就是所謂的DooD (Docker outside of Docker)
  • 集成maven並使用自定義的maven配置

二、編寫Dockerfile

宿主機執行命令,在家目錄下創建一個dockerfiles/jenkins文件夾用來存放我們的配置文件以及Dockerfile文件

$ cd ~ $ mkdir -p dockerfiles/jenkins 

在jenkins目錄下創建兩個文件,分別是settings.xml與Dockerfile

$ cd dockerfiles/jenkins $ touch settings.xml Dockerfile 

編輯settings.xml,主要是對maven的repository與mirror進行配置,內容如下

<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>/usr/share/maven/ref/repository</localRepository> <mirrors> <mirror> <id>aliyun-nexus</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>CN</id> <name>OSChina Central</name> <url>http://maven.oschina.net/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings> 

編輯Dockerfile,來源於 jenkins/jenkins:alpine,alpine系統中采用apk安裝軟件,我們把軟件安裝源換為國內鏡像源,安裝docker以及maven,並把jenkins用戶加入docker所在的999用戶組,內容如下

# ===================================================================== # Jenkins with DooD (Docker outside of Docker) and integration maven # ===================================================================== FROM jenkins/jenkins:alpine USER root ARG MAVEN_VERSION=3.6.0 ARG MAVEN_SHA=fae9c12b570c3ba18116a4e26ea524b29f7279c17cbaadc3326ca72927368924d9131d11b9e851b8dc9162228b6fdea955446be41207a5cfc61283dd8a561d2f ARG MAVEN_BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \ && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \ && apk add --no-cache tar procps tzdata shadow docker \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone \ && mkdir -p /usr/share/maven /usr/share/maven/ref/repository \ && curl -fsSL -o /tmp/apache-maven.tar.gz ${MAVEN_BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \ && echo "${MAVEN_SHA} /tmp/apache-maven.tar.gz" | sha512sum -c - \ && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \ && rm -f /tmp/apache-maven.tar.gz \ && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn \ && usermod -aG 999 jenkins \ && chown 1000:1000 /usr/share/maven/ref/repository \ && apk del tzdata shadow tar ENV MAVEN_HOME /usr/share/maven VOLUME /usr/share/maven/ref/repository COPY settings.xml /usr/share/maven/conf/settings.xml USER jenkins 

三、構建鏡像

在Dockerfile文件所在目錄執行如下命令進行鏡像的構建,就是docker build命令

$ docker build -t jenkins-dood . 

首次構建時需要等待時間可能稍微較長一點,但也不會很慢,因為我們使用的國內鏡像源,最終還是要視你的網絡而定

 
 

直到出現 Successfully tagged jenkins-dood:latest 說明構建完成,接下來我們來檢查一下剛才構建的鏡像

$ docker image ls
 
 

四、部署自定義jenkins

在rancher中部署我們新制作的jenkins-dood:latest鏡像,端口映射到主機30010

 
 

在宿主機中重新創建兩個數據卷掛載目錄,執行如下命令

$ cd /docker_volume $ mkdir maven-repo jenkins-dood-home 

數據卷中選擇添加路徑映射卷,需要添加兩個,分別命名為maven-repo與jenkins-dood-home,把我們剛才創建的兩個目錄分別映射到容器內部

 
 

再映射一個主機目錄到容器中,主要實現我們的dood,共用/var/run/docker.sock

 
 

確認一下安全/主機設置中,拉取鏡像為從不,因為我們鏡像在宿主機中

 
 

最后點擊啟動即可, 可以看到我們的工作負載中又多了一個我們剛才部署的jenkins-dood服務

 
 

接下來我們訪問 http://192.168.225.129:30010/ , 然后就需要和 docker決戰到底(四) Jenkins的安裝與使用 中的第二節 初始化Jenkins 做一樣的操作,這里就不重復進行記錄了。 初始化完成后進入到如下界面

 
 

思考: 初始jenkins步驟也是重復的,是否可以制作到Dockerfile中

五、使用自定義jenkins

我們創建一個新任務restful-api-demo,如下圖所示,選擇自由風格的軟件項目,然后確認

 
 

在源碼管理中選擇git,輸入git資源地址 https://github.com/wendell-dev/restful-api-demo.git

 
 

因為我們需要測試一下是否可以使用docker以及maven,所以直接選擇在構建里執行shell腳本來使用命令進行測試, shell命令中輸入的內容如下

mvn clean package docker build -t wendell/restful-api-demo:dood . 

因為我們的restful-api-demo應用中引入了dockerfile-maven-plugin插件(可查看項目中pom.xml文件的插件部分),所以也可以使用如下命令進行構建鏡像

mvn clean package dockerfile:build 
 
 

 
 

保存配置並進行構建后,我們查看一下構建日志

 
 
 
 

可以看出我們的maven命令能夠直接執行,而且還是從阿里雲鏡像倉庫下載的包,我們的docker build命令也執行成功,接下來我們進行最后的驗證,在宿主機執行如下命令檢查下載的包是否掛載到我們指定的目錄了以及鏡像是否存在

$ ls /docker_volume/maven-repo $ docker images 
 
 
 
 

六、使用小結

到此為止,我們成功制作了自己的jenkins鏡像,不需要再像前面那篇 docker決戰到底(四) Jenkins的安裝與使用 中那樣對jenkins進行繁瑣的配置,你也可以看見,我們除了初始化時安裝的默認插件外並沒有安裝任何其他插件就完成了springboot應用的編譯打包構建,我們把配置過程映射到了Dockerfile中,從而讓我們使用更輕松,以及可以更快速的遷移到其他容器機器上。

好了,本篇docker決戰到底實踐記錄就到這里,如果你有什么疑問或者文中有什么錯誤的地方,歡迎在留言區留言。 如果你願意,可以告訴我接下來你更希望看到哪方面的內容,我們可以一起加油!

本文資源可以在我的GitHub上找到
示例springboot項目 https://github.com/wendell-dev/restful-api-demo
自定義Dockerfile https://github.com/wendell-dev/dockerfiles/tree/master/jenkins

前文導航
Docker決戰到底(一) 虛擬機中安裝ubuntu系統
Docker決戰到底(二) Docker環境搭建
Docker決戰到底(三) Rancher2.x的安裝與使用
Docker決戰到底(四) Jenkins的安裝與使用



作者:wendell_dev
鏈接:https://www.jianshu.com/p/fb7b31a25358
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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