返回

将原生可执行文件容器化并在容器中运行

容器提供了开发环境与生产环境保持一致的灵活性,有助于隔离您的应用程序并最大限度地减少开销。对于使用 GraalVM Native Image 生成的自包含可执行文件,容器是显而易见的部署选择。

为了支持基于容器的开发,有多种 GraalVM 容器镜像可用,具体取决于平台、架构、Java 版本和版本。

本指南将展示如何将 Java 应用程序的原生可执行文件容器化。您将使用包含 Native Image 的 GraalVM 容器镜像,将 Java 应用程序提前编译为原生可执行文件。

下载示例应用程序

本指南使用 Spring Boot 3 Native Image 微服务示例。该示例是一个基于 Spring Boot 3 构建的最小化 REST API 应用程序。如果您调用 HTTP 端点 /jibber,它将返回一些以刘易斯·卡罗尔的《Jabberwocky》诗歌风格生成的无意义诗句。

前提条件

确保您已安装 GraalVM JDK。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问下载部分

  1. 安装并运行 Docker API 兼容的容器运行时,例如 Rancher DesktopDockerPodman

  2. 克隆 GraalVM Demos 仓库
     git clone https://github.com/graalvm/graalvm-demos.git
    
  3. 导航到示例目录
     cd graalvm-demos/native-image/spring-boot-microservice-jibber
    

构建并作为原生可执行文件运行

借助 Spring Boot 3 对 GraalVM Native Image 的内置支持,将 Spring Boot 3 应用程序编译为原生可执行文件变得更加容易。

  1. 构建原生可执行文件
     ./mvnw native:compile -Pnative
    

    -Pnative 配置文件用于为您的平台生成原生可执行文件。这将在 target/ 目录中生成一个名为 benchmark-jibber 的原生可执行文件。

  2. 运行原生可执行文件,并通过添加 & 将其置于后台
     ./target/benchmark-jibber &
    
  3. 使用 curl 调用端点
     curl https://:8080/jibber
    

    您应该会得到一个随机的无意义诗句。

  4. 使用 fg 将应用程序切换到前台,然后按 <CTRL-c> 停止应用程序。

容器化原生可执行文件

生成的主机可执行文件与平台相关。

  1. 使用以下命令容器化原生可执行文件。

    • 在 Linux 上,容器化上一步中生成的原生可执行文件
        docker build -f Dockerfiles/Dockerfile.native --build-arg APP_FILE=benchmark-jibber -t jibber-benchmark:native.0.0.1-SNAPSHOT .
      
    • 在 MacOS、Windows 或 Linux 上,使用多阶段 Docker 构建在容器内构建原生可执行文件,并将原生可执行文件打包到轻量级容器镜像中
        docker build -f Dockerfiles/Dockerfile -t jibber-benchmark:native.0.0.1-SNAPSHOT .
      
  2. 运行应用程序
     docker run --rm --name native -p 8080:8080 jibber-benchmark:native.0.0.1-SNAPSHOT
    
  3. 在新的终端窗口中,使用 curl 调用端点
     curl https://:8080/jibber
    

    它应该会生成一个随机的无意义诗句。

  4. 要停止应用程序,首先使用 docker ps 获取容器 ID,然后运行
     docker rm -f <container_id>
    
  5. 要删除容器镜像,首先使用 docker images 获取镜像 ID,然后运行
     docker rmi -f <image_1_id> <image_n_id>
    

总结

在本指南中,您了解了如何使用 GraalVM 容器镜像来容器化 Java 应用程序的原生可执行文件。

借助 GraalVM Native Image,您还可以构建完全静态的原生可执行文件,并将其直接打包到诸如 scratch 或 distroless 容器之类的微小容器中。

联系我们