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>

結果

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

相關文章
相關標籤/搜索