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 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 上找到完整的代码。