Maven插件構建Docker鏡像

背景

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

下面從Dev的角度來看一下Ops的工做。從Dev提交代碼,到完成集成測試的一系列步驟以下:docker

  1. 首先是開發人員把程序代碼更新後上傳到Git,而後其餘的事情都將由Jenkins自動完成。
  2. 而後Git在接收到用戶更新的代碼後,會把消息和任務傳遞給Jenkins,而後Jenkins會自動構建一個任務,下載Maven相關的軟件包。下載完成後,就開始利用Maven Build新的項目包,而後重建Maven容器,構建新的Image並Push到Docker私有庫中。
  3. 最後刪除正在運行的Docker容器,再基於新的鏡像從新把Docker容器啓動,自動完成集成測試。

整個過程都是自動的,這樣就簡化了本來複雜的集成工做,一天能夠集成一次,甚至是屢次。微信

本文主要關注的第二步,做爲Dev使用Maven插件構建Docker鏡像。架構

過程步驟

環境

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

  • 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支持,因此我這裏就不須要配置了maven

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中增長的配置:ui

<server>
      <id>docker-registry</id>
      <username>用戶名</username>
      <password>密碼</password>
      <configuration>
        <email>郵箱</email>
      </configuration>
    </server>複製代碼

結果

如感受文章對你有所幫助,能夠關注微信公衆號【五彩的顏色】鼓勵一下
相關文章
相關標籤/搜索