一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 利用Spring Boot創(chuàng)建docker image的完整步驟

利用Spring Boot創(chuàng)建docker image的完整步驟

2020-08-30 23:59程序那些事 Java教程

這篇文章主要給大家介紹了關(guān)于如何利用Spring Boot創(chuàng)建docker image的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在很久很久以前,我們是怎么創(chuàng)建Spring Bootdocker image呢?最最通用的辦法就是將Spring boot的應用程序打包成一個fat jar,然后寫一個docker file,將這個fat jar制作成為一個docker image然后運行。

今天我們來體驗一下Spring Boot 2.3.3 帶來的快速創(chuàng)建docker image的功能。

傳統(tǒng)做法和它的缺點

現(xiàn)在我們創(chuàng)建一個非常簡單的Spring Boot程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@SpringBootApplication
@RestController
public class Application {
 
 public static void main(String[] args) {
 SpringApplication.run(Application.class, args);
 }
 
 @GetMapping("/getInfo")
 public String getInfo() {
 return "www.flydean.com";
 }
}

默認情況下,我們build出來的是一個fat jar:springboot-with-docker-0.0.1-SNAPSHOT.jar

我們解壓看一下它的內(nèi)容:

利用Spring Boot創(chuàng)建docker image的完整步驟

Spring boot的fat jar分為三個部分,第一部分就是BOOT-INF, 里面的class目錄放的是我們自己編寫的class文件。而lib目錄存放的是項目依賴的其他jar包。

第二部分是META-INF,里面定義了jar包的屬性信息。

第三部分是Spring Boot的類加載器,fat jar包的啟動是通過Spring Boot的jarLauncher來創(chuàng)建LaunchedURLClassLoader,通過它來加載lib下面的jar包,最后以一個新線程啟動應用的Main函數(shù)。

這里不多講Spring Boot的啟動。

我們看一下,如果想要用這個fat jar來創(chuàng)建docker image應該怎么寫:

?
1
2
3
4
5
FROM openjdk:8-jdk-alpine
EXPOSE 8080
ARG JAR_FILE=target/springboot-with-docker-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

這樣寫有兩個問題。

第一個問題:我們是用的far jar,在使用far jar的過程中會有一定的性能問題,肯定要比解壓過后的性能要低,尤其是在容器環(huán)境中運行的情況下,可能會更加突出。

第二個問題:我們知道docker的image是按layer來構(gòu)建的,按layer構(gòu)建的好處就是可以減少image構(gòu)建的時間和重用之前的layer。

但是如果使用的是fat jar包,即使我們只修改了我們自己的代碼,也會導致整個fat jar重新更新,從而影響docker image的構(gòu)建速度。

使用Buildpacks

傳統(tǒng)的辦法除了有上面的兩個問題,還有一個就是需要自己構(gòu)建docker file,有沒有一鍵構(gòu)建docker image的方法呢?

答案是肯定的。

Spring Boot在2.3.0之后,引入了Cloud Native 的buildpacks,通過這個工具,我們可以非常非常方便的創(chuàng)建docker image。

在Maven和Gradle中,Spring Boot引入了新的phase: spring-boot:build-image

我們可以直接運行:

?
1
mvn spring-boot:build-image

運行之,很不幸的是,你可能會遇到下面的錯誤:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) on project springboot-with-docker: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image failed: Docker API call to 'localhost/v1.24/images/create?fromImage=gcr.io%2Fpaketo-buildpacks%2Fbuilder%3Abase-platform-api-0.3' failed with status code 500 "Internal Server Error" and message "Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)" -> [Help 1]

這是因為我們無法從gcr.io中拉取鏡像!

沒關(guān)系,如果你會正確的上網(wǎng)方式的話,那么我估計你已經(jīng)找到了一個代理。

將你的代理配置到Docker的代理項里面,我使用的是Docker desktop,下面是我的配置:

利用Spring Boot創(chuàng)建docker image的完整步驟

重新運行 mvn spring-boot:build-image

等待執(zhí)行結(jié)果:

[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ springboot-with-docker ---
[INFO] Building image 'docker.io/library/springboot-with-docker:0.0.1-SNAPSHOT'
[INFO]
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%

你可以看到,我們的確是需要從gcr.io拉取image。

Layered Jars

如果你不想使用Cloud Native Buildpacks,還是想使用傳統(tǒng)的Dockerfile。 沒關(guān)系,SpringBoot為我們提供了獨特的分層jar包系統(tǒng)。

怎么開啟呢? 我們需要在POM文件中加上下面的配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
 <plugins>
  <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
   <layers>
   <enabled>true</enabled>
   </layers>
  </configuration>
  </plugin>
 </plugins>
 </build>

再次打包,看下jar包的內(nèi)容:

利用Spring Boot創(chuàng)建docker image的完整步驟

看起來和之前的jar包沒什么不同,只不過多了一個layers.idx 這個index文件:

?
1
2
3
4
5
6
7
8
9
10
- "dependencies":
 - "BOOT-INF/lib/"
- "spring-boot-loader":
 - "org/"
- "snapshot-dependencies":
- "application":
 - "BOOT-INF/classes/"
 - "BOOT-INF/classpath.idx"
 - "BOOT-INF/layers.idx"
 - "META-INF/"

index文件主要分為4個部分:

  • dependencies – 非SNAPSHOT的依賴jar包
  • snapshot-dependencies – SNAPSHOT的依賴jar包
  • spring-boot-loader – Spring boot的class loader文件
  • application – 應用程序的class和resources文件

注意,這里的index文件是有順序的,它和我們將要添加到docker image中的layer順序是一致的。

最少變化的將會最先添加到layer中,變動最大的放在最后面的layer。

我們可以使用layertools jarmode來對生成的fat jar進行校驗或者解壓縮:

?
1
2
3
4
5
6
7
8
java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar
Usage:
 java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar
 
Available commands:
 list List layers from the jar that can be extracted
 extract Extracts layers from the jar for image creation
 help Help about any command

使用list命令,我們可列出jar包中的layer信息。使用extract我們可以解壓出不同的layer。

我們執(zhí)行下extract命令,看下結(jié)果:

利用Spring Boot創(chuàng)建docker image的完整步驟

可以看到,我們根據(jù)layers.idx解壓出了不同的文件夾。

我們看一下使用layer的dockerFile應該怎么寫:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
 
FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

這樣我們的一個分層的DockerImage就創(chuàng)建完成了。

自定義Layer

如果我們需要自定義Layer該怎么做呢?

我們可以創(chuàng)建一個獨立的layers.xml文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<layers xmlns="http://www.springframework.org/schema/boot/layers"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
  https://www.springframework.org/schema/boot/layers/layers-2.3.xsd">
 <application>
 <into layer="spring-boot-loader">
  <include>org/springframework/boot/loader/**</include>
 </into>
 <into layer="application" />
 </application>
 <dependencies>
 <into layer="snapshot-dependencies">
  <include>*:*:*SNAPSHOT</include>
 </into>
 <into layer="company-dependencies">
  <include>com.flydean:*</include>
 </into>
 <into layer="dependencies"/>
 </dependencies>
 <layerOrder>
 <layer>dependencies</layer>
 <layer>spring-boot-loader</layer>
 <layer>snapshot-dependencies</layer>
 <layer>company-dependencies</layer>
 <layer>application</layer>
 </layerOrder>
</layers>

怎么使用這個layer.xml呢?

添加到build plugin中就可以了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
 <plugins>
  <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
   <layers>
   <enabled>true</enabled>
   <configuration>${project.basedir}/src/main/resources/layers.xml</configuration>
   </layers>
  </configuration>
  </plugin>
 </plugins>
 </build>

本文的例子: springboot-with-docker

總結(jié)

到此這篇關(guān)于利用Spring Boot創(chuàng)建docker image完整步驟的文章就介紹到這了,更多相關(guān)Spring Boot創(chuàng)建docker image內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務器之家!

原文鏈接:http://www.flydean.com/springboot-docker-image/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产51社区精品视频资源 | 5x视频在线观看 | 色综合久久98天天综合 | 欧美美女被艹 | 欧美日韩中文国产一区 | 美女扒开尿口让男生添 漫画 | 俄罗斯男男激情1069gay | 黑人又大又硬又粗再深一点 | 久久精品国产久精国产果冻传媒 | 亚洲视频一区在线播放 | 乌克兰17一18处交 | 久久久久综合 | 91制片厂果冻传媒杨柳作品 | 久久精品一区 | 亚洲成人aa| 久久精品嫩草影院免费看 | 日本韩国一区二区三区 | 99资源在线观看 | 三级黄色片在线观看 | 欧美视频一区二区三区在线观看 | 国产欧美亚洲精品第一页青草 | 欧美gay xxxx| 亚洲免费在线视频 | 国产精品每日在线观看男人的天堂 | www.尤物| 久久国产精品永久免费网站 | 久久久久影视 | 亚洲精品网址 | 先锋影音 av | 日韩国产欧美视频 | 亚洲无毛片 | 国产精品亚洲片在线观看麻豆 | 叛佛 作者满栀小说免费阅读 | 免费理伦片在线观看全网站 | 毛片应用 | 日韩拍拍拍 | 精品无人区麻豆乱码1区2 | 日本人泡妞18xxⅹ | 欧美日韩一区二区综合 | 污斗罗大陆 | 亚洲swag精品自拍一区 |