1. 程式人生 > >Jenkins自動化部署容器

Jenkins自動化部署容器

上一篇文章《Dockerfile配置APM監控實現Java容器的效能監控》實現了在tomcat容器中部署APM監控,就著這個話題我們繼續擴充套件一下如何自動化部署。關於自動化部署容器,最常用到的是Jenkins,公司也有相關環境。但是為了全面的學習容器,我這次不用公司的Jenkins環境,而是直接用容器重新部署一套。

前提條件:需要兩臺裝了Docker引擎的Centos7機器,一臺作為Jenkins宿主機,一臺作為要自動部署容器的宿主機(直接引用上一篇文章提到的裝置和tomcat基礎檔案)。

1、編寫Jenkins的Dockerfile,主要是為了安裝SVN客戶端

# New docker file from zgh
# VERSION 1.1
# Author: zgh

#基礎映象
FROM jenkins:2.60.3

#作者
#MAINTAINER <
[email protected]
> USER root #安裝SVN客戶端(容器hosts不能在映象中修改) RUN apt-get install -y subversion USER jenkins #預設工作目錄 WORKDIR /var/jenkins_home

說明:jenkins儘量選最新版本的,本次用的是2.60.3版。

2、生成Jenkins容器

先是在Dockerfile目錄下build一個jenkins映象(後面的.表示路徑,別忽略)

docker build -t jenkins-zgh:v1.1 .

然後通過以下命令執行容器,注意:由於連線公司的SVN伺服器需要修改hosts檔案,但是我們不應直接在容器中修改,而又無法在Dockerfile中配置(因為hosts檔案是在啟動容器時才被載入生成),所以我們需要在這裡add-host一下SVN的地址。

docker run --name jenkins-zgh -d --restart=unless-stopped -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home --add-host rexen-products:172.17.2.13 jenkins-zgh:v1.1

執行以上命令前,還需要在主機上建立一下卷目錄(/var/jenkins_home,實現將jenkins容器中的配置及專案檔案都固化到宿主機上)。執行完命令,就生成了一個埠為8080,hosts中加了SVN(rexen-products   172.17.2.13)地址的Jenkins了。

3、配置Jenkins

容器啟動後,就可以連線Jenkins,需要做一些初始化配置,另外對於本次操作來說,還需要安裝配置一些外掛(有的外掛可能預設已安裝):SSH外掛:(Publish Over SSHSSH Agent)、Maven外掛(Maven Integration plugin)、Docker外掛(Docker Commons PluginDocker Pipeline)等。

(1)配置SSH(系統管理-->系統設定-->Publish over SSH)

配置項包括Passphrase(遠端SSH登入linux的密碼)、SSH Servers(Name、Hostname、Username、Remote Directory),Remote Directory(遠端操作目錄,該配置很關鍵,遠端安裝部署容器就通過這個目錄操作)。最後通過Test Configuration來測試一下SSH是否能夠遠端訪問。以下是我配置的SSH Servers, 其中Remote Directory配置為 /home:

(2)其他配置

如果只是單純的實現Docker自動部署,沒有什麼需要額外的配置,Jenkins Location可能需要配置一下Jenkins的IP和埠,Subversion選擇預設的版本1.8。如果不是用SVN管理Dockerfile,而是用GitHub,那就需要配置一下GitHub Servers。如果Docker映象還想自動釋出到registry上,那還要再配置一下Docker registry的相關引數。

4、將需要構建的容器專案上傳SVN

(1)配置pom.xml,由於只做容器簡單構建,不需要程式碼編譯,所以寫的比較簡單:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
	<groupId>dockerManven</groupId>
	<artifactId>dockerManven</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>dockerManven</name>
  <url>http://maven.apache.org</url>
  <build>
    <plugins>
         <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>tomcat-docker:v1.4</imageName>
                <dockerDirectory>${basedir}</dockerDirectory> <!-- 指定 Dockerfile 路徑-->
                <!-- 這裡是複製 jar 包到 docker 容器指定目錄配置,也可以寫到 Docokerfile 中 -->
                <resources>
                    <resource>
                        <targetPath>/usr/local/tomcat</targetPath>
                        <directory>${project.build.directory}</directory>
                        <!--<include>${project.build.finalName}.jar</include>-->
                    </resource>
                </resources>
            </configuration>
        </plugin>   
    </plugins>
</build>
</project>

(2)我們將上一篇文章《Dockerfile配置APM監控實現Java容器的效能監控》(具體如何部署tomcat容器及APM監控參照這篇文章)提到的tomcat容器Dockerfile及相關檔案,連同pom.xml都提交到SVN伺服器上:

5、建立Jenkins專案

選擇構建一個Maven專案,專案名稱:TestDocker

(1)原始碼管理,選擇Subversion,將上面所上傳的SVN專案路徑配置到Repository URL,選擇SVN賬號(首次需要Add賬號)

(2)Build項填寫pom.xml

(3)構建後操作

由於沒有程式碼編譯這一環節,所以上面的build操作其實沒有實際意義,所以【構建後操作】成為最關鍵的一步,我們需要用這一步,將Dockerfile及相關檔案傳送到遠端端Linux,並執行docker build和docker run操作(當然你也可以改成在本地docker build,然後docker push到Repository,最後通過SSH遠端命令在遠端端Linux上執行docker pull和docker run)。

本次要SSH傳送的檔案目錄,含有子目錄apminsight,所以需要在一次Transfers Set配置中用逗號分隔,因為SSH遠端傳送預設不會遞迴傳送子資料夾,所以分成多目錄傳送,Source files支援用逗號分隔傳送多個資料夾,如下所示:

Remote directory很關鍵,由於以上第3步配置Jenkins時,SSH的Remote directory配置為了 /home,所以這裡配置完後,操作目錄就相當於指向了 /home/TestDocker,加上配完的Source files,相當於告訴jenkins將SVN專案下的*和apminsight/*傳送到遠端Linux(172.17.2.84)下的 /home/TestDocker 目錄下。

(1)本次我配了兩項Transfers Set,第一項只配置Exec command,其他不配置,主要是遠端清除歷史建立的容器和刪除歷史構建檔案,以便做到反覆構建。

Exec command中的程式碼為:

#docker rm -f  tomcat-docker:v1.4 
#刪除已建的容器,防止容器名,埠衝突
docker ps | grep tomcat-docker | grep -v "grep" | awk '{print $1}' | xargs docker rm -f
sleep 1
#刪除已構建的映象,防止映象名衝突
docker images | grep tomcat-docker | grep -v "grep" | awk '{print $3}' | xargs docker rmi
#刪除SSH傳輸過來的歷史構建檔案
rm -rf /home/TestDocker

(2)新增和配置第二項Transfers Set,實現傳輸待構建的Dockerfile及相關檔案,並執行docker build和docker run

Exec command中的程式碼為:

sleep 1
cd /home/TestDocker
docker build -t tomcat-docker:v1.4 . 
sleep 1
docker run --name docker-tomcat -d --restart=unless-stopped -p 8088:8080 -e APM_HOST=172.16.1.251 -e APM_IS_OPEN=false -v /opt/tomcat-logs:/usr/local/tomcat/logs tomcat-docker:v1.4    #執行映象生成容器

這樣就基本配置完了(如果需要傳送郵件和執行定時構建專案,就按網上說的通用方式繼續配置),直至儲存專案。

6、構建Docker專案

對已建立的專案,點選構建,就能看到容器的build過程

最後看到docker run成功後,專案也就SUCCESS了

驗證一下容器是否在遠端Linux下成功啟動(通過docker ps檢視),我這是直接通過Rancher平臺檢視: