知識庫 / Spring / Spring Boot RSS 訂閱

Liberica 運行時容器上的 Spring Boot 應用

Docker,Spring Boot
HongKong
5
11:26 AM · Dec 06 ,2025

1. 引言

在本教程中,我們將探討如何將使用 Spring Boot 創建的標準 Java 應用程序作為 Docker 容器運行的方法。 尤其是,我們將使用 Liberica JDK 在 Alpaquita Linux 上創建 Docker 鏡像來運行我們的應用程序。

Liberica JDK 和 Alpaquita Linux 是 BellSoft 產品組合的一部分。 BellSoft 是一家致力於使 Java 成為雲原生應用程序的首選語言的組織。 通過其有針對性的產品,他們承諾提供更好的體驗,降低成本。

2. 一個簡單的 Spring Boot 應用程序

讓我們從創建一個簡單的 Java 應用程序開始,該應用程序我們將進行容器化。我們將使用 Spring Boot 來創建該應用程序。 Spring Boot 使創建獨立的、生產級別的基於 Spring 的應用程序變得容易,並且配置量極少。

初始化一個 Spring Boot 應用程序最簡單的方法是使用 Spring Boot CLI。 它可以讓我們從我們最喜歡的命令行中使用 start.spring.io 創建新項目:

$ spring init --build=gradle --dependencies=web spring-bellsoft

在這裏,我們添加了 web 作為依賴項,以便我們可以使用 RESTful API 和 Apache Tomcat 作為默認嵌入式容器構建應用程序。我們選擇了 Gradle 作為構建工具。但是,它選擇了 Java 作為語言,以及許多其他默認選項。

然後,我們可以將生成的項目導入到我們最喜歡的 IDE 中,比如 IntelliJ Idea,並開始開發應用程序。正如之前所説,我們將保持這個非常簡單。因此,我們將添加一個簡單的 REST API,它接受一個數字作為輸入並返回不超過該數字的斐波那契數列:

@RestController
public class DemoController {

    @GetMapping("/api/v1/fibs")
    public List<Integer> getFibonacciSeriesBelowGivenInteger(Integer input) {
        List<Integer> result;
        if (input == 0)
            result = List.of(0);
        else {
            int n = 0; int m = 1;
            result = new ArrayList<>(Arrays.asList(n));
            while (m <= input) {
                result.add(m);
                m = n + m; n = m - n;
            }
        }
        return result;
    }
}

在Gradle中構建應用程序就像運行以下命令一樣簡單,該命令使用在之前生成的Gradle包裝器:

./gradlew clean build

生成的項目的默認打包格式為 JAR,這意味着在命令成功執行後,最終可執行的 JAR 文件將會創建在“./build/libs”輸出目錄下。我們可以使用該 JAR 文件啓動應用程序:

java -jar ./build/libs/spring-bellsoft-0.0.1-SNAPSHOT.jar

然後,我們可以調用我們的API並查看它是否正常工作:

$ curl http://localhost:8080/api/v1/fibs?input=5
[0,1,1,2,3,5]

這標誌着我們創建簡單應用程序的努力結束,該應用程序將在教程的後續部分中使用,並可用於容器化該應用程序。

3. 將我們的應用程序容器化

容器是一個 軟件的標準單元,它將代碼及其所有依賴項打包在一起。 它是操作系統虛擬化的形式,提供了一種一致的方式來部署應用程序。 如今,它已成為在雲環境中運行任何應用程序的首選方式。

我們需要一個容器平台來以容器的形式運行我們的簡單應用程序。 容器平台,在其他方面,提供了一個容器引擎,用於創建和管理容器。 Docker 是專門設計用於構建、共享和運行容器應用程序的最受歡迎的平台。

容器引擎從容器鏡像創建容器。 容器鏡像是一個不可變靜態文件,其中包含容器運行所需的一切。 但是,它與主機操作系統內核共享。 因此,它提供完整的隔離,但仍然輕量級:

創建 Docker 鏡像的一種方法是 將創建鏡像的配方描述為 Dockerfile。 然後,我們可以使用 Docker 守護進程從 Dockerfile 創建鏡像。 原始的 Docker 鏡像格式現在已成為 Open Container Initiative (OCI) 鏡像規範。

運行應用程序作為容器的一個關鍵優勢是,它提供了一個在多個環境中的一致部署體驗。 例如,假設我們使用 Java 17 構建並部署了我們的簡單應用程序,但部署在具有 Java 11 運行時環境的服務器上。

為了避免這種意外情況,容器鏡像 允許我們打包應用程序的關鍵依賴項,例如操作系統二進制文件/庫和 Java 運行時。 通過這樣做,我們可以確保應用程序在任何環境中都能以相同的方式運行。

4. Liberica 運行時容器

容器鏡像由多個層疊加而成。每一層都代表對文件系統的特定修改。通常,我們從與應用程序要求最匹配的基礎鏡像開始,然後在其之上構建額外的層。

BellSoft 提供了幾種高度優化用於在雲環境上運行 Java 應用程序的鏡像。 這些鏡像基於 Alpaquita Linux 和 Liberica JDK 構建。在使用這些鏡像之前,讓我們來審視 BellSoft 組件的優勢。

4.1. Alpaquita Linux 的優勢

Alpaquita Linux基於 Alpine Linux 的輕量級操作系統。 它專門為 Java 應用程序優化,並針對雲原生應用程序的部署進行了優化。 這導致基礎鏡像大小為 3.22 MB,並且只需要少量資源即可運行。

Alpaquita Linux 有兩個版本,一個基於優化的 musl libc,另一個基於 glib libc。 這裏,libc 指的是 C 編程語言的標準庫,按照 ISO C 標準所指定。 它提供宏、類型定義和用於各種任務的函數。

除了針對 Java 應用程序進行優化外,Alpaquita Linux 還 提供多個安全功能以供我們的部署使用。 這些包括網絡功能、自定義構建選項和進程隔離。 它還包括內核加固功能,如內核鎖定和內核模塊簽名。

此外,Alpaquita Linux 針對部署進行了優化,因為它使用內核模塊壓縮來減小軟件包的大小。 它提供了一個可靠且快速的堆棧,用於以性能功能(如內核優化和內存管理)運行應用程序。

Alpaquita Linux 僅包含少量操作系統組件。 但是,我們可以從 Alpaquita APK 倉庫 安裝額外的模塊和附加軟件包。 最重要的是,Alpaquita Linux 針對其 LTS 版本提供四年的支持週期。

4.2. Liberica JDK 的優勢

Liberica JDK 是一個用於現代 Java 部署的開源 Java 運行時環境。它由 BellSoft 提供,BellSoft 是 OpenJDK 的關鍵貢獻者,承諾為 Java 應用程序提供雲、服務器和桌面環境的單一運行時。它還推薦用於基於 Spring 的 Java 應用程序。

Liberica JDK 支持多種架構,如 x86 64/32 位、ARM、PowerPC 和 SPARC。它還支持 Windows、macOS 和大多數 Linux 發行版等多個操作系統。此外,它還支持當今使用的 Java 幾乎所有版本。

Liberica JDK 的關鍵優勢之一是其輕量級。基於 Alpaquita Linux 的 Liberica 運行時容器,用於 Java 17,小於 70MB。它承諾在減少網絡流量、存儲空間、內存消耗和總成本的同時,提供更好的性能。

它還提供用於與 JDK 運行時一起工作的各種工具。可以獲得對監控和更新工具的完整訪問權限。此外,用户還可以訪問 Liberica 管理中心 (LAC),這是一個用於運行時監控、許可控制和安全更新的企業級工具。

Liberica JDK 已通過 TCK 驗證,符合 Java SE 規範,並在每次發佈前都經過徹底測試,以防止暴露問題。此外,BellSoft 保證 Liberica JDK 至少有八年的生命週期,包括錯誤修復、安全補丁和其他必要的改進。

5. 創建容器鏡像

現在,我們準備使用 Alpaquita Linux 和 Liberica JDK 將我們的簡單應用程序容器化。第一步是選擇包含這些依賴項的基礎鏡像。我們當然可以創建我們的基礎鏡像,但幸運的是,BellSoft 在 Docker Hub 上維護了多個鏡像供我們選擇。

5.1. 選擇 Liberica 運行時容器

這些是包含不同 Liberica JDK Lite 和 Liberica JRE 選項的 Alpaquita Linux 鏡像。我們通常可以通過標籤來識別這些鏡像,該標籤可能包含以下內容:

  • jdk: Alpaquita Linux 鏡像,包含 Liberica JDK Lite 版本
  • jdk-all: 提供 Liberica JDK 包,可用於使用 jlink 工具創建自定義運行時環境
  • jre: 僅包含 Liberica JRE,用於運行 Java 應用程序

這裏,鏡像的 <strong tag of the image reveals much other information about the image 除了 JDK 版本外,還揭示了大量關於鏡像的信息。讓我們來看看 BellSoft 使用的鏡像標籤約定:

[JDK type]-Java version-[slim]-[OS release]-[libc type]-[date]

在這裏,不同的標籤部分指示了圖像的特定方面,並幫助我們從眾多可用圖像中選擇合適的圖像:

  • JDK 類型:JDK 的類型(JDK、jdk-all 和 jre,如前面所見)
  • Java 版本:JDK 兼容的 Java 版本
  • slim:指示圖像是否為 slim 圖像
  • OS 版本:OS 版本(目前僅為 stream
  • libc 類型:標準 C 庫的類型(glibc 或 musl,如前面所見)
  • 日期:圖像的發佈日期

5.2. 容器化我們的應用程序

現在,我們已經擁有了圖像標籤中所有必要的信息,以便選擇最合適的選項。例如,如果我們想使用 Java 17 與 glibc 供我們的應用程序使用,則必須選擇“jdk-17-glibc”標籤。

一旦我們選擇了正確的基線鏡像標籤,下一步就是創建 Dockerfile,以定義我們希望如何創建應用程序的容器鏡像:

FROM bellsoft/liberica-runtime-container:jdk-17-glibc
VOLUME /tmp
ARG JAR_FILE=build/libs/java-bellsoft-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

這個相對簡單的 Dockerfile 表明我們希望從指定的 Liberica 運行時容器開始,並複製我們的應用程序胖 JAR 包。我們還定義了入口點,並提供了在容器實例化後運行應用程序的指令。

我們應該將此 Dockerfile 放置在應用程序代碼庫的根目錄下。然後,可以使用以下命令在本地倉庫中創建容器鏡像:

docker buildx build -t spring-bellsoft .

這將從註冊表中默認拉取基礎鏡像,併為我們的應用程序創建容器鏡像。之後,我們可以將此鏡像作為容器運行:

docker run --name fibonacci -d -p 8080:8080 spring-bellsoft

請注意,我們已將本地端口 8080 與容器端口 8080 映射。因此,我們可以像教程前面一樣訪問我們的應用程序:

$ curl http://localhost:8080/api/v1/fibs?input=5 
[0,1,1,2,3,5]

這標誌着我們成功地將簡單的應用程序容器化,該應用程序此前在教程中使用了 BellSoft 發佈的可伸縮運行時容器(Liberica runtime containers)。當然,我們也希望能嘗試更復雜的應用程序以及其他可用的 Liberica runtime containers 的變體

6. 結論

在本教程中,我們學習了創建基於簡單 Spring Boot Java 應用程序容器的基本知識。我們探討了選擇 BellSoft Liberica 運行時容器的選項。在此過程中,我們創建了一個簡單的應用程序並將其容器化。

這幫助我們瞭解了 Alpaquita Linux 和 Liberica JDK 的優勢,它們是 Liberica 運行時容器的組成部分。BellSoft 致力於優化 Java 應用程序以供基於雲的環境使用。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.