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