日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎么把一個Java應(yīng)用打包成Docker鏡像

本文轉(zhuǎn)載自微信公眾號「網(wǎng)管叨bi叨」,作者KevinYan11。轉(zhuǎn)載本文請聯(lián)系網(wǎng)管叨bi叨公眾號。

怎么把Java應(yīng)用打包成Docker鏡像?對熟悉Docker的同學(xué)這應(yīng)該是一個很簡單的問題,把項目打包成JAR包然后在Dockerfile里用ADD命令把JAR文件放到鏡像里,啟動命令設(shè)置執(zhí)行這個JAR文件即可。

比如一個使用Maven構(gòu)建的Spring應(yīng)用就可以用下面這個Dockerfile構(gòu)建鏡像。

 
 
 
  1. FROM openjdk:8-jre 
  2. ADD target/*.jar /application.jar 
  3. ENTRYPOINT ["java", "-jar","/application.jar"] 

上面這個Dockerfile很好理解,使用Maven構(gòu)建的Java項目的目錄結(jié)構(gòu)統(tǒng)一是

 
 
 
  1. project 
  2. │   pom.xml 
  3. └───src // 源文件目錄 
  4. │   │ 
  5. │   └───main 
  6. │       │    
  7. │       └───java 
  8. │        
  9. └───target // class和jar文件的目錄 

用mvn clean package打包后會把JAR文件生成在target目錄里,通過java -jar命令即可執(zhí)行編譯好的程序。

所以上面的Dockerfile里就進行了把JAR從target目錄里添加到Docker鏡像中以及將jar -jar /application.jar 設(shè)置成容器的啟動命令這兩步操作。

不過除了這種最原始的方法外我們還可以使用Maven的一些插件,或者Docker的多階段打包功能來完成把Java應(yīng)用打包成Docker鏡像的動作。

Maven插件構(gòu)建鏡像

Spotify公司的dockerfile-maven-plugin和Google公司出品的jib-maven-plugin是兩款比較有名的插件,下面簡單介紹一下dockerfile-maven-plugin的配置和使用。

其實使用方法很簡單,我們在POM文件里引入這個plugin,并結(jié)合上面那個Dockerfile就能讓插件幫助我們完成應(yīng)用鏡像的打包。

 
 
 
  1. com.example 
  2.     hello-spring 
  3.     0.0.1-SNAPSHOT 
  4.     helloworld 
  5.  
  6.  com.spotify 
  7.  dockerfile-maven-plugin 
  8.  1.4.10 
  9.   
  10.    
  11.   default 
  12.        
  13.         build 
  14.         push 
  15.        
  16.      
  17.    
  18.    
  19.     ${docker.registry.url}/${image.prefix}/${artifactId} 
  20.     ${project.version} 
  21.      
  22.       ${project.build.finalName}.jar 
  23.      
  24.    
  25.  

插件里使用的docker.registry.url和image.prefix是我單獨為Docker的鏡像倉庫設(shè)置的屬性。

 
 
 
  1.  
  2.  1.8 
  3.   kevinyan001 
  4.    
  5.  

這里可以隨意設(shè)置成私有倉庫的遠程地址和鏡像前綴,比如在阿里云的鏡像服務(wù)上創(chuàng)建一個叫docker-demo的空間,上面的屬性就需要這樣配置:

 
 
 
  1.  
  2.   1.8 
  3.   docker-demo 
  4.   registry.cn-beijing.aliyuncs.com 
  5.  

在POM文件里配置好插件后伴隨著我們打包應(yīng)用執(zhí)行mvc clean package操作時dockerfile-maven-plugin就會自動根據(jù)我們的配置打包好一個叫做kevinyan001/hello-spring:0.0.1-SNAPSHOT的Docker鏡像。

dockerfile-maven-plugin除了能幫助我們打包應(yīng)用鏡像外還可以讓它幫助我們把鏡像push到遠端倉庫,不過我覺得用處不大,感興趣的同學(xué)可以去網(wǎng)上搜搜看這部分功能怎么配置。

用Docker的多階段構(gòu)建打包鏡像

上面介紹了使用Maven插件幫助我們打包Java應(yīng)用的鏡像,其實我們還可以把mvn clean package這一步也交給Docker來完成。當(dāng)然把Java應(yīng)用的源碼放在Docker鏡像里再編譯打包在發(fā)布出去肯定是有問題的,我們知道在Dockerfile里每個指令A(yù)DD、RUN這些都是在單獨的層上進行,指令越多會造成鏡像越大,而且包含Java項目的源碼也是一種風(fēng)險。

不過好在后來Docker支持了多階段構(gòu)建,允許我們在一個Dockerfile里定義多個構(gòu)建階段,先拉起一個容器完成用于的構(gòu)建,比如說我們可以在這個階段里完成JAR的打包,然后第二個階段重新使用一個jre鏡像把上階段打包好的JAR文件拷貝到新的鏡像里。

“這一點在Go語言比較有優(yōu)勢,第一階段編譯好的二進制執(zhí)行文件直接拷貝到一個最基礎(chǔ)的linux鏡像里就能讓Go的應(yīng)用在容器里運行。關(guān)于Go應(yīng)用的多階段打包,可以查看我以前的文章線上Go項目的Docker鏡像應(yīng)該怎么構(gòu)建? 進行了解。

使用下面的Dockerfile可以通過多階段構(gòu)建完成Java應(yīng)用的Docker鏡像打包。

 
 
 
  1. # Dockerfile也可以不放在項目目錄下,通過 -f 指定Dockerfile的位置,比如在項目根下執(zhí)行以下命令  
  2. docker build -t  -f  . 
  3.  
  4. FROM kevinyan001/aliyun-mvn:0.0.1 AS MAVEN_BUILD 
  5.  
  6. COPY pom.xml /build/ 
  7. COPY src /build/src 
  8.  
  9. WORKDIR /build/ 
  10. # mount anonymous host directory as .m2 storage for contianer  
  11. VOLUME /root/.m2 
  12.  
  13. RUN mvn clean package -Dmaven.test.skip=true --quiet 
  14.  
  15. FROM openjdk:8-jre 
  16.  
  17.  
  18. COPY --from=MAVEN_BUILD /build/target/*.jar /app/application.jar 
  19.  
  20. ENTRYPOINT ["java", "-jar", "/app/application.jar"] 

上面我們用的這些Dockerfile也可以不用放在項目的根目錄里,現(xiàn)在已經(jīng)支持通過 -f 指定Dockerfile的位置,比如在項目根下執(zhí)行以下命令完成鏡像的打包。

 
 
 
  1. docker build -t kevinyan001/hello-spring:0.0.1 -f  . 

上面第一個鏡像是我自己做的,因為Maven官方的鏡像的遠程倉庫慢的一批,只能自己包裝一下走阿里云的鏡像源了。試了試速度也不快,主要是隨隨便便一個Spring項目依賴就太多了。大家如果這塊有什么加快Docker 構(gòu)建速度的方法也可以留言一起討論討論。

不可否認用多階段構(gòu)建打出來的Go鏡像基本上是10M左右,但是Spring的應(yīng)用隨隨便便就是上百兆,這個對容器的構(gòu)建速度、網(wǎng)絡(luò)傳輸成本是有影響的,那么Spring應(yīng)用的鏡像怎么瘦身呢,這個就留到以后的文章進行探討了。


文章名稱:怎么把一個Java應(yīng)用打包成Docker鏡像
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/djichdg.html