1. 简介

本教程将探索如何将标准 Spring Boot 创建的 Java 应用作为 Docker 容器运行。具体来说,我们将基于 Alpaquita Linux 使用 Liberica JDK 构建 Docker 镜像来运行应用。

Liberica JDK 和 Alpaquita Linux 是 BellSoft 公司产品组合的一部分。BellSoft 致力于让 Java 成为云原生应用的首选语言,通过其针对性产品承诺以更低成本提供更优体验。

2. 创建简单的 Spring Boot 应用

首先创建一个基础的 Java 应用用于容器化演示。使用 Spring Boot 创建应用,它能以最小配置快速构建生产级独立 Spring 应用

最简单的初始化方式是使用 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 接口:接收数字参数,返回小于等于该数的斐波那契数列:

@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 Wrapper 构建应用:

./gradlew clean build

默认打包格式为 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-Container-Stack

创建 Docker 镜像的方式之一是使用 Dockerfile 定义镜像构建步骤,然后通过 Docker 守护进程生成镜像。Docker 的原始镜像格式现已发展为 Open Container Initiative (OCI) 镜像规范。

容器化应用的核心优势是提供跨环境的一致部署体验。例如,避免因目标环境 Java 版本(如 Java 17 应用部署到 Java 11 环境)导致的意外问题。

容器镜像允许我们打包所有关键依赖(如操作系统二进制文件/库和 Java 运行时),确保应用在任何环境中行为一致。

4. Liberica 运行时容器

容器镜像由多个堆叠层组成,每层代表文件系统的特定修改。通常从符合应用需求的基础镜像开始,在其上构建额外层。

BellSoft 提供多个高度优化的镜像,专用于在云环境运行 Java 应用。这些镜像基于 Alpaquita Linux 和 Liberica JDK 构建,使用前先了解其组件优势。

4.1. Alpaquita Linux 的优势

Alpaquita Linux基于 Alpine Linux 的轻量级操作系统,专为 Java 设计并针对云原生应用部署优化。基础镜像仅 3.22 MB,运行资源需求极低。

Alpaquita Linux 提供两个版本:基于优化的 musl libcglib libc。其中 libc 是 C 语言标准库,提供宏、类型定义和函数等。

除针对 Java 应用优化外,Alpaquita Linux还提供多项安全特性

  • ✅ 网络功能增强
  • ✅ 自定义构建选项
  • ✅ 进程隔离
  • ✅ 内核强化(如内核锁定和模块签名)

此外,通过内核模块压缩减少包大小,结合内核优化和内存管理等性能特性,提供可靠快速的应用运行栈。

Alpaquita Linux仅打包少量操作系统组件,但可通过 Alpaquita APK 仓库 安装额外模块和包。LTS 版本提供四年支持周期。

4.2. Liberica JDK 的优势

Liberica JDK面向现代 Java 部署的开源运行时。由 OpenJDK 主要贡献者 BellSoft 提供,支持云、服务器和桌面场景的统一运行时,也是 Spring 应用的推荐选择。

Liberica JDK 支持多种架构(x86 64/32 位、ARM、PowerPC、SPARC)和操作系统(Windows、macOS、主流 Linux 发行版),覆盖几乎所有当前使用的 Java 版本。

核心优势之一是轻量化:基于 Alpaquita Linux 的 Java 17 运行时容器镜像小于 70 MB,在提升性能的同时降低流量、存储、内存消耗和总成本

提供丰富的 JDK 工具集:

  • ✅ 完整的监控和更新工具
  • ✅ 企业级 Liberica 管理中心(LAC),用于运行时监控、许可证控制和安全更新

Liberica JDK 通过 Java SE TCK 验证,每次发布前均经过严格测试。BellSoft承诺提供至少八年的生命周期支持,包括错误修复、安全补丁和其他改进。

5. 创建容器镜像

现在使用 Alpaquita Linux 和 Liberica JDK 容器化我们的应用。第一步是选择包含这些依赖的基础镜像,虽然可以自行构建,但 BellSoft 在 Docker Hub 维护了多种现成镜像

5.1. 选择 Liberica 运行时容器

这些镜像提供不同选项的 Liberica JDK Lite 和 Liberica JRE,可通过标签识别:

  • jdk:包含 Liberica JDK Lite 的 Alpaquita Linux 镜像
  • jdk-all:包含可通过 jlink 工具创建自定义运行时的完整 Liberica JDK
  • jre:仅包含运行 Java 应用的 Liberica JRE

镜像标签包含除 JDK 版本外的关键信息,BellSoft 的标签命名规范如下:

[JDK类型]-Java版本-[slim]-[OS版本]-[libc类型]-[日期]

各部分含义:

  • JDK 类型:jdkjdk-alljre
  • Java 版本:JDK 符合的 Java 版本
  • slim:是否为精简版
  • OS 版本:当前仅 stream
  • libc 类型:glibcmusl
  • 日期:镜像发布日期

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 运行时容器为基础,复制应用 fat JAR,并定义容器启动时的入口命令。

将 Dockerfile 放在项目根目录,执行以下命令构建本地镜像:

docker buildx build -t spring-bellsoft .

此命令从默认仓库(Docker Hub)拉取基础镜像,构建应用镜像。然后运行容器:

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 运行时容器容器化基础应用的演示。建议尝试更复杂的应用和其他 Liberica 运行时容器变体

6. 总结

本教程介绍了为简单 Spring Boot 应用创建容器的基础知识,探讨了使用 BellSoft Liberica 运行时容器的方案。过程中我们创建了一个基础应用并完成容器化。

通过实践,我们理解了 Liberica 运行时容器组成部分——Alpaquita Linux 和 Liberica JDK 的优势。这些是 BellSoft 的核心产品,致力于优化云环境中的 Java 应用部署。


原始标题:Spring Boot Application on Liberica Runtime Container | Baeldung