微服務架構下,微服務在帶來良好的設計和架構理念的同時,也帶來了運維上的額外複雜性,尤爲是在服務部署和服務監控上。單體應用是集中式的,就一個單體跑在一塊兒,部署和管理的時候很是簡單,而微服務是一個網狀分佈的,有不少服務須要維護和管理,對它進行部署和維護的時候則比較複雜。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>
如感受文章對你有所幫助,能夠關注微信公衆號【五彩的顏色】鼓勵一下