Docker中使用Spring Boot示例
在本教程中,我们将看到如何构建用于运行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

