跳过正文

创建来自 Java 应用程序的 Docker 镜像

Java Docker Spring-Boot Containerization DevOps
作者
Harpal Singh
Software Engineer
翻译者
Namastecode
目录

1. 介绍

Docker 是一个很好的选择,能够使应用程序在不同环境中可部署。在本教程中,我们将学习如何将我们的 Java 应用程序打包成一个可以在任何地方一致运行的 Docker 镜像。

我们将使用之前创建的 file-upload application,并配置它以构建可执行的 JAR 文件。然后,我们将其打包成 Docker 镜像。

让我们开始吧。

2. 设置我们的Java项目

在本教程中,我们将使用Maven来管理我们项目的依赖关系和构建过程。

2.1 Maven 配置 (pom.xml)

首先,让我们配置我们的 pom.xml 文件,以便将 jar 文件及其所有依赖项打包在一起。为此,我们将使用添加到 <build> 部分下的 maven-assembly-plugin

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.5.0</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.namastecode.SpringBoot3ThymeleafApplication</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

让我们来分解一下重要的部分:

  • <mainClass> 指定了我们应用程序的入口点。
  • <descriptorRefs> 配置为 jar-with-dependencies 将我们的应用程序及其所有依赖项打包到一个单独的 JAR 文件中。
  • <execution> 告诉 Maven 在 Maven 生命周期的 package 阶段运行。

现在,当我们运行 mvn package 时,Maven 会在 target 目录中创建两个 JAR 文件 - 一个包含依赖项,另一个不包含依赖项。包含依赖项的 JAR 文件会带有 jar-with-dependencies 后缀。

我们可以使用以下命令测试应用程序是否正常运行:

java -jar target/spring-boot-3-thymeleaf-0.0.1-SNAPSHOT-jar-with-dependencies.jar

现在我们准备好创建一个 Docker 镜像了。

3. Docker化Java应用程序

容器是打包Java应用的一个很好的方式。它们提供了一致的运行环境,无论应用部署在哪里。让我们来看看如何为我们的Java应用创建一个Docker镜像。

3.1 创建 Dockerfile

我们首先在项目的根目录下添加一个 Dockerfile:

spring-boot-3-thymeleaf/
├── src/
│   ├── main/
│   │   └── java/
│   │       └── com/namastecode/
|   |           |   -- Other files        
│   │           └── SpringBoot3ThymeleafApplication.java
│   └── test/
│       └── java/
├── pom.xml
└── Dockerfile

一个 Dockerfile 只是一个文本文件,包含了 Docker 用来组装镜像的指令。每条指令都会创建一个新的不可变层,建立在之前的层之上。

我们将首先定义我们的基础镜像以及我们希望在容器内放置应用程序的工作目录。接下来,我们将复制 JAR 文件并添加运行它的指令:

FROM eclipse-temurin:23-jre-alpine

WORKDIR /app

COPY target/spring-boot-3-thymeleaf-0.0.1-SNAPSHOT-jar-with-dependencies.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

对于我们的基础镜像,我们使用 eclipse-temurin:23-jre-alpine,这是基于 Alpine Linux 的轻量级 JRE(Java 运行时环境)版本。当运行 Java 应用程序时,如果不需要特定的依赖项,这是一个理想的选择。

我们将 /app 定义为容器内的工作目录。在这里,我们会使用 COPY 命令将我们的应用程序复制过来。最后,我们设置入口点,以便通过 java -jar 命令运行我们的应用程序。入口点是容器启动时将执行的命令。

3.2 创建 Docker 镜像

现在,我们在项目根目录下运行 build 命令来创建一个新镜像:

docker build -t spring-boot-3-thymeleaf .
确保在此步骤之前有一个正在运行的 Docker 守护进程,否则您将会遇到错误。此外,不要忘记命令末尾的点,它告诉 Docker 在当前目录中查找 Dockerfile。

在镜像创建完成后,我们可以简单地运行 docker image ls 来验证镜像是否成功构建。

3.3 运行 Docker 镜像

最后,让我们运行我们容器化的 Java 应用程序:

docker run -p 8090:8090 spring-boot-3-thymeleaf:latest

这将启动一个新的容器,并在其中运行我们的 Java 应用程序。我们应该在终端中看到来自您 Spring Boot 应用程序的日志。此外,我们将主机上的端口 8090 映射到容器中的端口 8090,这是我们的 Spring Boot 应用程序所暴露的端口。要检查应用程序是否在运行,我们可以在网页浏览器中访问 http://localhost:8090

4. 结论

在本教程中,我们学习了如何从 Java 应用程序创建 Docker 镜像。我们首先配置了我们的 Maven 项目,以便将应用程序及其依赖项打包,然后创建了一个 Dockerfile 来定义镜像,最后构建并运行了 Docker 镜像。

您可以在 GitHub 上找到完整的代码。

相关文章

如何在 Spring Boot 中上传文件
Spring Spring-Boot File-Upload Thymeleaf
如何使用Restclient重试
Spring-Boot Restclient
在 Spring Framework 6 中使用 Rest Client 进行 Http 请求
Spring Restclient HTTP Rest Openai