微服務架構下,微服務在帶來良好的設計和架構理念的同時,也帶來了運維上的額外複雜性,尤爲是在服務部署和服務監控上。單體應用是集中式的,就一個單體跑在一塊兒,部署和管理的時候很是簡單,而微服務是一個網狀分佈的,有不少服務須要維護和管理,對它進行部署和維護的時候則比較複雜。java
下面從Dev的角度來看一下Ops的工做。從Dev提交代碼,到完成集成測試的一系列步驟以下:docker
整個過程都是自動的,這樣就簡化了本來複雜的集成工做,一天能夠集成一次,甚至是屢次。微信
本文主要關注的第二步,做爲Dev使用Maven插件構建Docker鏡像。架構
筆者的電腦系統是MacOS,在進行下面的步驟以前,先具有一下條件:app
Maven 和JDK 就不用過多多了,必須具備的。Docker Registry是私有的hub,mac上裝好docker以後,配置一下Docker Registry的地址,配置以下:運維
由於docker默認須要私服作https支持,我這邊以前有個私服作了https支持,因此我這裏就不須要配置了maven
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上。測試
FROM java:8複製代碼
COPY target/maven-docker-image-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar" ,"/app.jar"]複製代碼
在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>複製代碼