1. 程式人生 > 程式設計 >Maven外掛構建Docker映象的實現步驟

Maven外掛構建Docker映象的實現步驟

背景

微服務架構下,微服務在帶來良好的設計和架構理念的同時,也帶來了運維上的額外複雜性,尤其是在服務部署和服務監控上。單體應用是集中式的,就一個單體跑在一起,部署和管理的時候非常簡單,而微服務是一個網狀分佈的,有很多服務需要維護和管理,對它進行部署和維護的時候則比較複雜。

下面從Dev的角度來看一下Ops的工作。從Dev提交程式碼,到完成整合測試的一系列步驟如下:

  1. 首先是開發人員把程式程式碼更新後上傳到Git,然後其他的事情都將由Jenkins自動完成。
  2. 然後Git在接收到使用者更新的程式碼後,會把訊息和任務傳遞給Jenkins,然後Jenkins會自動構建一個任務,下載Maven相關的軟體包。下載完成後,就開始利用Maven Build新的專案包,然後重建Maven容器,構建新的Image並Push到Docker私有庫中。
  3. 最後刪除正在執行的Docker容器,再基於新的映象重新把Docker容器啟動,自動完成整合測試。

整個過程都是自動的,這樣就簡化了原本複雜的整合工作,一天可以整合一次,甚至是多次。

本文主要關注的第二步,作為Dev使用Maven外掛構建Docker映象。

過程步驟

環境

筆者的電腦系統是MacOS,在進行下面的步驟之前,先具備一下條件:

  • Docker Registry
  • Maven(3.5.0)
  • JDK(1.8.0_131)
  • Docker for Mac (17.09.0-ce-mac35)

Maven 和JDK 就不用過多多了,必須具有的。Docker Registry是私有的hub,mac上裝好docker之後,配置一下Docker Registry的地址,配置如下:

因為docker預設需要私服做https支援,我這邊之前有個私服做了https支援,所以我這裡就不需要配置了

pom 配置

pom檔案中需要引入相應的外掛。docker-maven-plugin有三款:spotify、fabric8io和bibryam。其中第一款最為流行,資料也多,所以毫不猶豫選擇第一款。

外掛有兩種使用方式,一種是在直接在pom配置中指定baseImage和entryPoint。另一種適合於複雜的構建,使用dockerfile,只需要在配置中指定dockerfile的位置。前一種比較簡單,此處略過,主要講下第二種的配置

<plugin>
       <groupId>com.spotify</groupId>
       <artifactId>docker-maven-plugin</artifactId>
       <version>${maven.docker.version}</version>
       <!--外掛繫結到phase-->
       <executions>
         <execution>
           <phase>install</phase>
           <goals>
             <goal>build</goal>
           </goals>
         </execution>
       </executions>
       <configuration>
       <!--配置變數,包括是否build、imageName、imageTag,非常靈活-->
         <skipDocker>${docker.skip.build}</skipDocker>
         <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
         <!--最後映象產生了兩個tag,版本和和最新的-->
         <imageTags>
           <imageTag>${project.version}</imageTag>
           <imageTag>latest</imageTag>
         </imageTags>
         <forceTags>true</forceTags>         
         <env>
           <TZ>Asia/Shanghai</TZ>
         </env>
         <!--時區配置-->
         <runs>
           <run>ln -snf /usr/share/zoneinfo/$TZ /etc/localtime</run>
           <run>echo $TZ > /etc/timezone</run>           
         </runs>
         <dockerDirectory>${project.basedir}</dockerDirectory>
         <resources>
           <resource>
             <targetPath>/</targetPath>
             <directory>${project.build.directory}</directory>
             <include>${project.build.finalName}.jar</include>
           </resource>
         </resources>
         <!--push到私有的hub-->
         <serverId>docker-registry</serverId>
       </configuration>

</plugin>

${maven.docker.version}${docker.skip.build}${docker.image.prefix}都是可配置的變數。${project.basedir}${project.build.directory}${project.build.finalName}${project.version}分別對應專案根目錄、構建目錄、打包後生成的結果名稱、專案版本號。

上面的pom外掛配置,指定了dockerfile的位置和映象的命名規則。並將docker的build目標,繫結在install這個phase上。

dockerfile

FROM java:8

COPY target/maven-docker-image-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

setting.xml

在pom外掛中,還有一個serverId的配置。這個配置是必要的,對於需要將image上傳到私有hub上,在如上配置之後,只需要加上-DpushImage即可實現。serverId是與maven的配置檔案setting.xml相對應,setting.xml中增加的配置:

<server>
 <id>docker-registry</id>
 <username>使用者名稱</username>
 <password>密碼</password>
 <configuration>
  <email>郵箱</email>
 </configuration>
</server>

結果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。