使用 Docker 运行 Spring Boot 应用程序

x33g5p2x  于2022-09-29 转载在 Spring  
字(3.7k)|赞(0)|评价(0)|浏览(453)

在本教程中,我们将学习如何使用 Docker 使用两种不同的方法运行 Spring Boot 应用程序:设置 Dockerfile 和使用 Spring Boot Maven 插件 的配置选项。

硬性要求

  • 用于构建 Spring Boot 应用程序的 JDK 1.8 或更新版本
  • 您机器上的 Docker 环境。作为替代方案,您可以考虑使用 Podman。

出于本示例的目的,我们将使用 Spring Boot 命令行界面。您可以选择任何其他选项来引导您的 Spring Boot 项目。

创建一个简单的 Spring Boot REST 项目

首先,创建一个包含 web 依赖项的新项目:

spring init -dweb demo-rest

现在在您最喜欢的 IDE 中导入 Maven 项目并添加一个名为 Customer 的模型类,它将由 GET 请求返回:

package com.example.demorest;

public class Customer {
  private int id;
  private String name;

  public Customer(int id, String name) {
    super();
    this.id = id;
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }
}

在 Spring Boot 中构建 Rest Service 所需的只是一个 RestController:

package com.example.demorest;

import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomerController {
  @RequestMapping("/")
  public List<Customer> findAll() {
    List<Customer> customerList = new ArrayList<Customer>();
    customerList.add(new Customer(1, "frank"));
    customerList.add(new Customer(2, "john"));
    return customerList;
  }
}

RestController@RestController 注释提供了@ResponseBody 和@Controller 注释的组合。这是创建 REST 控制器的标准选项。

RequestMapping:带有**@RequestMapping** 的方法将处理对“/”URI 的通用请求。如果未指定,它会映射一个 GET 请求。

现在编译并打包应用程序:

$ mvn clean install

让我们检查一下构建示例应用程序的 Docker 映像的两种可用方法

选项#1 创建一个 Dockerfile

首先,在项目根文件夹中创建一个文件Dockerfile,内容如下:

FROM adoptopenjdk/openjdk11:alpine-jre
# Add Maintainer Info
LABEL maintainer="marchioni.francesco@gmail.com"

# Add a volume pointing to /tmp
VOLUME /tmp

# Make port 8080 available to the world outside this container
EXPOSE 8080

# The application's jar file
ARG JAR_FILE=target/demo-docker-0.0.1-SNAPSHOT.jar

# Add the application's jar to the container
ADD ${JAR_FILE} demo-docker-0.0.1-SNAPSHOT.jar

# Run the jar file
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo-docker-0.0.1-SNAPSHOT.jar"]

这个 Dockerfile 非常简单:让我们回顾一下:

  • FROM:这是我们将使用的基础镜像:adoptopenjdk/openjdk11:alpine-jre。如果您更喜欢使用 JDK 8,请切换到 openjdk:8-jdk-alpine 映像作为基础映像。
  • VOLUME:卷允许将容器生成的数据保存在主机上,并与容器共享主机操作系统的目录。VOLUME 指令在容器上创建具有指定路径的挂载点。运行容器时,您可以指定热操作系统上给定挂载点将映射到的目录。之后,容器写入挂载路径的任何内容都会写入主机操作系统上的映射目录。在上面的 Dockerfile 中,我们创建了一个路径为 /tmp 的挂载点,因为这是 Spring Boot 应用程序为 Tomcat 创建工作目录的地方默认。
  • EXPOSE:该指令允许您将某个端口暴露给外界。
  • ARGARG 指令定义了一个具有默认值的变量。您可以通过在构建时传递变量来覆盖该变量的默认值。
ARG <name>[=<default value>]
  • ADDADD 指令允许将新文件和目录复制到 docker 映像。
  • ENTRYPOINT:这是在容器内执行的应用程序入口点。

Dockerfile 保存在当前目录中。然后,我们将构建并标记应用程序:

docker build -t docker-demo .

最后,您可以使用以下命令运行它:

docker run -p 8080:8080 docker-demo

应用程序将在端口 8080 上启动:

此示例的源代码可在此处获得:https://github.com/fmarchioni/masterspringboot/tree/master/demo-docker

选项#2 使用 Spring Boot Maven 插件

此选项不需要创建任何其他文件。您只需要在 spring-boot-maven-plugin 中添加 image 的配置选项:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <image>
      <name>pedroluiznogueira/${project.artifactId}:${project.version}</name>
    </image>
    <pullPolicy>IF_NOT_PRESENT</pullPolicy>
  </configuration>
</plugin>

您还可以指定 pullPolicy:可接受的值为 ALWAYS、NEVER 和 IF_NOT_PRESENT。

接下来,要构建它,请运行:

mvn spring-boot:build-image

如果您检查可用 Docker 映像的列表,您将看到一个新的可用:

$ docker images
REPOSITORY                                    TAG           IMAGE ID       CREATED          SIZE
docker-demo                                   latest        e861294b2bee   17 minutes ago   166MB
. . . .
pedroluiznogueira/pom-example                 0.0.3         d546b71161e4   42 years ago     275MB

最后,运行镜像如下:

docker run -p 8080:8080 docker.io/pedroluiznogueira/pom-example:0.0.3

应用程序将启动:

伟大的!我们刚刚设法在 Docker 上运行了我们的第一个 Spring Boot 应用程序!

第二个示例的源代码可在此处获得:https://github.com/pedroluiznogueira/docker-pom-example

感谢 Java 软件工程师 Pedro Luiz 分享了这个例子。

继续学习 Spring Boot 和容器

如果您想了解如何为您自动创建 Dockerfile 和映像,请查看本教程:如何构建 Spring Boot 应用程序的 Docker 映像

如果您想了解如何在 OpenShift 上部署 Spring Boot 应用程序,请查看:How to run a Spring Boot application on Openshift.

相关文章