1. 概述
Spring Boot 3具有一些新功能,例如将我们的应用程序构建为GraalVM本机镜像或Java 17基线。然而,另一个相关的支持是Docker Compose。
在本教程中,我们将介绍如何将Docker Compose工作流与Spring Boot 3集成。
2. Spring Boot 3 Docker Compose支持提供什么?
通常,我们会基于docker-compose.yml运行docker-compose up来启动容器,并运行docker-compose down来停止容器。现在,我们可以将这些Docker Compose命令委托给Spring Boot 3。当Spring Boot应用程序启动或停止时,它还将管理我们的容器。
此外,它还内置了对多种服务的管理,例如SQL数据库、MongoDB、Cassandra等。因此,我们可能不需要在应用程序资源文件中复制配置类或属性。
最后,我们将看到我们可以将此支持与自定义Docker镜像和Docker Compose配置文件一起使用。
3. 设置
我们需要Docker Compose和Spring Boot 3来探索这一新支持。
3.1 Docker Compose
Docker Compose需要已安装Docker引擎,它们很容易安装,但根据操作系统的不同可能会有所不同。
Docker在我们的主机中作为服务运行。通过Docker镜像,我们可以将容器作为系统中的轻量级进程运行。我们可以将一个镜像视为最小Linux内核之上的多个镜像层。
3.2 Spring Boot 3
有多种方法可以设置Spring Boot 3项目。例如,我们可以使用3.1.0版本的Spring initializer。但是,我们始终需要Spring Boot 3 Starter库来用于项目中包含的依赖项。
首先,我们添加一个parent POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<relativePath />
</parent>
我们希望为我们的应用程序使用REST端点,因此我们需要Web依赖项;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我们将连接到一个示例数据库。有多种开箱即用的支持,我们将使用MongoDB:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
为了检查我们的应用程序是否已启动并运行,我们将使用Spring Boot Actuator进行检查:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
最后,我们将添加Docker Compose依赖项。如果我们想使用其他项目功能但排除Docker Compose支持,我们可以将optional标签设置为true:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<version>3.1.1</version>
</dependency>
如果我们使用Gradle,我们可能会考虑使用Spring Boot Gradle插件来进行类似BOM的依赖管理。
4. 包含Docker Compose的Spring Boot 3应用程序启动
我们将使用MongoDB数据库创建一个Spring Boot 3应用程序,一旦我们在启动时有了spring-boot-docker-compose依赖项,我们的应用程序就会启动docker-compose.yml文件中的所有服务。
4.1 Docker Compose文件
首先,我们创建一个docker-compose.yml文件:
version: '3.8'
services:
db:
image: mongo:latest
ports:
- '27017:27017'
volumes:
- db:/data/db
volumes:
db:
driver:
local
4.2 Spring Profile
我们需要告诉Spring Boot 3 Docker Compose文件的名称及其路径,我们可以将其添加到application-{profile}属性或YAML文件中。我们将使用docker-compose Spring profile。因此,我们将创建一个application-docker-compose.yml配置文件:
spring:
docker:
compose:
enabled: true
file: docker-compose.yml
4.3 数据库配置
我们不需要数据库配置,Docker Compose支持将创建一个默认的。但是,我们仍然可以使用profile添加MongoDB配置,例如:
@Profile("!docker-compose")
这样,我们就可以选择是否使用Docker Compose支持。如果我们不使用profile,应用程序将期望数据库已经在运行。
4.4 模型
然后,我们为常规项目创建一个简单的Document类:
@Document("item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Item {
@Id
private String id;
private String name;
private int quantity;
private String category;
}
4.5 控制器
最后,让我们定义一个具有一些CRUD操作的控制器:
@RestController
@RequestMapping("/item")
@RequiredArgsConstructor
public class ItemController {
// ...
@PostMapping(consumes = APPLICATION_JSON_VALUE)
public ResponseEntity<Item> save(final @RequestBody Item item) {
return ResponseEntity.ok(itemRepository.save(item));
}
// other endpoints
}
5. 应用测试
我们可以通过从最喜欢的IDE或命令行启动主Spring Boot 3类来启动应用程序。
5.1 应用程序启动
让我们记住指定Spring profile。例如,从命令行,我们可以使用Spring Boot Maven插件:
mvn spring-boot:run -Pdocker-compose -Dspring-boot.run.profiles=docker-compose
我们还添加了专用的Maven构建profile(-Pdocker-compose),以防其他profile存在。
现在,如果我们执行docker ps,我们将看到MongoDb容器正在运行:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77a9667b291a mongo:latest "docker-entrypoint.s…" 21 hours ago Up 10 minutes 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp classes-db-1
我们现在可以对我们的应用程序进行一些实时测试。
5.2 应用程序检查
我们可以使用Actuator端点检查我们的应用程序是否已启动并正在运行:
curl --location 'http://localhost:8080/actuator/health'
如果一切正常,我们应该得到200状态:
{
"status": "UP"
}
对于数据库检查,让我们在端点http://localhost:8080/item处使用POST调用添加一些元素。例如,让我们看一个curl Post请求:
curl --location 'http://localhost:8080/item' \
--header 'Content-Type: application/json' \
--data '{
"name" : "Tennis Ball",
"quantity" : 5,
"category" : "sport"
}'
我们将收到包含生成的元素ID的响应:
{
"id": "64b117b6a805f7296d8412d9",
"name": "Tennis Ball",
"quantity": 5,
"category": "sport"
}
5.3 应用程序关闭
最后,关闭Spring Boot 3应用程序也会停止我们的容器。我们可以通过执行docker ps-a看到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77a9667b291a mongo:latest "docker-entrypoint.s…" 22 hours ago Exited (0) 5 seconds ago classes-db-1
6. Docker Compose支持功能
让我们快速说明最相关的Docker Compose支持功能。
6.1 服务连接
此支持将在启动时自动发现多种服务,我们已经看到了MongoDB。但是,还有其他一些,例如Redis或ElasticSearch。服务连接将查找并使用本地映射的端口,我们可以跳过配置类或属性,这是由Spring Boot使用ConnectionDetails抽象来完成的。
6.2 自定义镜像
我们可以通过应用label来使用自定义Docker镜像:
version: '3.8'
services:
db:
image: our-custom-mongo-image
ports:
- '27017:27017'
volumes:
- db:/data/db
labels:
org.springframework.boot.service-connection: mongo
volumes:
db:
driver:
local
6.3 等待容器准备就绪
有趣的是,Spring Boot 3将自动检查容器的准备情况。容器可能需要一些时间才能完全准备好,因此,这个功能让我们可以使用healthcheck命令来查看容器是否准备就绪。
6.4 激活Docker Compose Profile
我们可以在运行时在不同的Docker Compose profile之间切换。我们的服务定义可能很复杂,因此我们可能想要选择启用哪个profile,例如,如果我们处于调试或生产环境中,我们可以通过使用配置属性来实现这一点:
spring.docker.compose.profiles.active=myprofile
7. Docker Compose支持的好处
在生产环境中,我们的Docker服务可能分布在不同的实例上。因此,在这种情况下,我们可能不需要这种支持。但是,我们可以激活从docker-compose.yml定义加载的Spring profile,仅用于本地开发。
这种支持与我们的IDE很好地集成,我们不会在命令行上来回跳转来启动和停止Docker服务。
从3.1版本开始支持。总体而言,已经有了一些很好的功能,例如多服务连接、服务准备就绪的默认检查以及使用Docker Compose profile的可能性。
8. 总结
在本文中,我们介绍了Spring Boot 3.1.0中新的Docker Compose支持,我们了解了如何使用它设置和创建Spring Boot 3应用程序。
继Spring Boot易于开发的特点之后,这种支持也很方便,并且已经具备了很好的特性。在启动和停止应用程序时,Spring Boot 3管理Docker服务的生命周期。
与往常一样,示例代码可以在GitHub上找到。