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 镜像的方式之一是使用 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 libc 和 glib 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 JDKjre
:仅包含运行 Java 应用的 Liberica JRE
镜像标签包含除 JDK 版本外的关键信息,BellSoft 的标签命名规范如下:
[JDK类型]-Java版本-[slim]-[OS版本]-[libc类型]-[日期]
各部分含义:
- JDK 类型:
jdk
、jdk-all
或jre
- Java 版本:JDK 符合的 Java 版本
slim
:是否为精简版- OS 版本:当前仅
stream
- libc 类型:
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 运行时容器为基础,复制应用 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 应用部署。