Docker中使用Spring Boot示例

时间:2020-01-09 10:44:32  来源:igfitidea点击:

在本教程中,我们将看到如何构建用于运行Spring Boot应用程序的Docker镜像。我们将创建一个基本的DockerFile,以对使用Thymeleaf创建视图的Spring Boot MVC应用程序进行泊坞化。

Maven依赖

由于我们正在创建Web应用程序,因此我们需要一个spring-boot-starter-web,对于Thymeleaf,我们需要spring-boot-starter-thymeleaf,而且spring-boot-maven-plugin也已添加到我们的pom.xml中。该插件提供了许多方便的功能

  • 它有助于创建可执行jar(über-jar),从而使执行和传输服务更加方便。
  • 它还搜索公共static void main()方法,以将具有此方法的类标记为可运行类。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.theitroad</groupId>
  <artifactId>SprinBootProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringBootProject</name>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
     </dependency>
     <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

Spring Boot Web应用程序的类

我们将为我们的Web应用程序添加一个简单的控制器。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MessageController {
  @GetMapping("/")
  public String showMessage(Model model) { 
    model.addAttribute("msg", "Welome to Docker");
    return "message";
  }
}

视图类(Thymeleaf模板)

在src / main / resources中添加了一个新文件夹Templates,并在其中创建了message.html文件。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring Boot With Docker</title>
</head>
<body>
 <div>
    <p th:text="${msg}"></p>
 </div>
</body>
</html>

应用类别

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootProjectApp {
  public static void main(String[] args) {
    SpringApplication.run(SpringBootProjectApp.class, args);
  }
}

运行应用程序

我们可以将此Spring Boot Web应用程序作为独立的Java应用程序运行,但是我们将通过创建可执行jar来运行它。

要创建完全独立的可执行jar文件,请从命令行运行mvn package。请注意,我们应该位于Spring Boot项目目录中。

theitroad:SprinBootProject$ mvn package

要使用创建的jar运行应用程序,可以使用java -jar命令,如下所示:

java -jar target/SprinBootProject-0.0.1-SNAPSHOT.jar

但是,我们将通过创建DockerFile来执行相同的操作。

Docker文件

为了在Docker容器中的应用程序中运行,我们需要创建一个镜像,该镜像是一个只读模板,其中包含创建Docker容器的说明。

为了创建Docker镜像,我们需要创建一个Dockerfile,它是一个文本文件,具有简单的语法,用于定义创建镜像和运行它所需的步骤。 Dockerfile中的每条指令都会在镜像中创建一个层。

在项目目录中创建一个名为DockerFile的文本文件,然后在其中复制以下文本。

FROM openjdk:8-jdk-alpine

ARG JAR_FILE=target/SprinBootProject-0.0.1-SNAPSHOT.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","/app.jar"]
  • 通常,一个镜像基于另一个镜像,并进行一些其他自定义。在我们的情况下也是如此,此处使用的基本镜像是openjdk:8-jdk-alpine该镜像基于流行的Alpine Linux项目,该项目比大多数分发基本镜像(〜5MB)小得多,因此导致图像通常更薄。
  • 然后为jar路径指定一个名称。
  • 复制jar文件。
  • 通过提供以下格式的参数,使用ENTRYPOINT指令执行jar-ENTRYPOINT [" executable"," param1"," param2"],这使其等效于java -jar target / SprinBootProject-0.0.1-SNAPSHOT.jar

创建一个Docker镜像

我们可以通过以下形式运行命令来创建Docker镜像:

sudo docker build -t name:tag .

对于我们的项目命令,创建docker镜像

sudo docker build -t sbexample:1.0 .

.表示使用当前目录作为上下文
将镜像标记为sbexample:1.0

创建容器(运行图像)

docker run命令必须指定要从中派生容器的镜像。

sudo docker run -d -p 8080:8080 sbexample:1.0

这里的选项是

-d以分离模式启动容器(在后台运行容器)
-p将所有公开的端口发布到主机接口

如果一切正常,那么此时我们将拥有一个dockerized Spring Boot应用程序,我们可以通过在浏览器中输入URL http:// localhost:8080 /进行访问。

如果要查看正在运行的容器,请使用以下命令

sudo docker ps

要停止正在运行的容器,请使用以下命令

sudo docker stop container_id