Maven插件構(gòu)建Docker鏡像的實(shí)現(xiàn)步驟
背景
微服務(wù)架構(gòu)下,微服務(wù)在帶來(lái)良好的設(shè)計(jì)和架構(gòu)理念的同時(shí),也帶來(lái)了運(yùn)維上的額外復(fù)雜性,尤其是在服務(wù)部署和服務(wù)監(jiān)控上。單體應(yīng)用是集中式的,就一個(gè)單體跑在一起,部署和管理的時(shí)候非常簡(jiǎn)單,而微服務(wù)是一個(gè)網(wǎng)狀分布的,有很多服務(wù)需要維護(hù)和管理,對(duì)它進(jìn)行部署和維護(hù)的時(shí)候則比較復(fù)雜。
下面從Dev的角度來(lái)看一下Ops的工作。從Dev提交代碼,到完成集成測(cè)試的一系列步驟如下:
- 首先是開(kāi)發(fā)人員把程序代碼更新后上傳到Git,然后其他的事情都將由Jenkins自動(dòng)完成。
- 然后Git在接收到用戶更新的代碼后,會(huì)把消息和任務(wù)傳遞給Jenkins,然后Jenkins會(huì)自動(dòng)構(gòu)建一個(gè)任務(wù),下載Maven相關(guān)的軟件包。下載完成后,就開(kāi)始利用Maven Build新的項(xiàng)目包,然后重建Maven容器,構(gòu)建新的Image并Push到Docker私有庫(kù)中。
- 最后刪除正在運(yùn)行的Docker容器,再基于新的鏡像重新把Docker容器啟動(dòng),自動(dòng)完成集成測(cè)試。
整個(gè)過(guò)程都是自動(dòng)的,這樣就簡(jiǎn)化了原本復(fù)雜的集成工作,一天可以集成一次,甚至是多次。
本文主要關(guān)注的第二步,作為Dev使用Maven插件構(gòu)建Docker鏡像。
過(guò)程步驟
環(huán)境
筆者的電腦系統(tǒng)是MacOS,在進(jìn)行下面的步驟之前,先具備一下條件:
- Docker Registry
- Maven(3.5.0)
- JDK(1.8.0_131)
- Docker for Mac (17.09.0-ce-mac35)
Maven 和JDK 就不用過(guò)多多了,必須具有的。Docker Registry是私有的hub,mac上裝好docker之后,配置一下Docker Registry的地址,配置如下:
因?yàn)閐ocker默認(rèn)需要私服做https支持,我這邊之前有個(gè)私服做了https支持,所以我這里就不需要配置了
pom 配置
pom文件中需要引入相應(yīng)的插件。docker-maven-plugin有三款:spotify、fabric8io和bibryam。其中第一款最為流行,資料也多,所以毫不猶豫選擇第一款。
插件有兩種使用方式,一種是在直接在pom配置中指定baseImage和entryPoint。另一種適合于復(fù)雜的構(gòu)建,使用dockerfile,只需要在配置中指定dockerfile的位置。前一種比較簡(jiǎn)單,此處略過(guò),主要講下第二種的配置
<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> <!--最后鏡像產(chǎn)生了兩個(gè)tag,版本和和最新的--> <imageTags> <imageTag>${project.version}</imageTag> <imageTag>latest</imageTag> </imageTags> <forceTags>true</forceTags> <env> <TZ>Asia/Shanghai</TZ> </env> <!--時(shí)區(qū)配置--> <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}
分別對(duì)應(yīng)項(xiàng)目根目錄、構(gòu)建目錄、打包后生成的結(jié)果名稱、項(xiàng)目版本號(hào)。
上面的pom插件配置,指定了dockerfile的位置和鏡像的命名規(guī)則。并將docker的build目標(biāo),綁定在install這個(gè)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插件中,還有一個(gè)serverId的配置。這個(gè)配置是必要的,對(duì)于需要將image上傳到私有hub上,在如上配置之后,只需要加上-DpushImage即可實(shí)現(xiàn)。serverId是與maven的配置文件setting.xml相對(duì)應(yīng),setting.xml中增加的配置:
<server> <id>docker-registry</id> <username>用戶名</username> <password>密碼</password> <configuration> <email>郵箱</email> </configuration> </server>
結(jié)果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決
這篇文章主要介紹了SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04spring-security關(guān)于hasRole的坑及解決
這篇文章主要介紹了spring-security關(guān)于hasRole的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot整合阿里云開(kāi)通短信服務(wù)詳解
這篇文章主要介紹了如何利用SpringBoot整合阿里云實(shí)現(xiàn)短信服務(wù)的開(kāi)通,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下2022-03-03SpringBoot?項(xiàng)目中創(chuàng)建線程池
這篇文章主要介紹了SpringBoot?項(xiàng)目中創(chuàng)建線程池,文章基于Spring?Boot項(xiàng)目創(chuàng)建線程池ThreadPoolExecutor,需要的小伙伴可以參考一下2022-04-04Java集合框架Collections原理及用法實(shí)例
這篇文章主要介紹了Java集合框架Collections原理及用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08關(guān)于Spring Bean實(shí)例過(guò)程中使用反射和遞歸處理的Bean屬性填充問(wèn)題
本文帶領(lǐng)大家一起學(xué)習(xí)下在Spring Bean實(shí)例過(guò)程中如何使用反射和遞歸處理的Bean屬性填充,需要在類 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加補(bǔ)全屬性方法,具體操作方法跟隨小編一起學(xué)習(xí)下吧2021-06-06SpringBoot集成tomcat詳解實(shí)現(xiàn)過(guò)程
采用spring boot之后,一切變得如此簡(jiǎn)單,打包->java-jar->運(yùn)維,只需要一個(gè)jar包便可以隨意部署安裝。這篇文章,將對(duì) spring boot集成tomcat的源碼進(jìn)行分析,探索其內(nèi)部的原理2023-02-02