1. 概述
Spring Boot 3 引入了新的功能,例如將我們的應用程序構建為 GraalVM 原生鏡像或 Java 17 基線。 然而,Docker Compose 的支持同樣重要。
在本教程中,我們將學習如何將 Docker Compose 工作流集成到 Spring Boot 3 中。
2. Spring Boot 3 Docker Compose 支持提供什麼?
通常,我們使用 docker-compose up 命令啓動容器,使用 docker-compose down 命令停止容器,基於 docker-compose.yml 文件。現在,Spring Boot 3 可以委託這些 Docker Compose 命令。當 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 項目。例如,我們可以使用 Spring 從版本 3.1.0 起的 初始化器。但是,我們始終需要為項目包含的依賴項使用 Spring Boot 3 starter 庫。
首先,我們添加一個 父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 Plugin 來實現類似 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:
local4.2. Spring 配置文件
我們需要告訴 Spring Boot 3 Docker Compose 文件的名稱和路徑。我們可以通過在 application-{profile} 屬性文件中或 YAML 文件中添加這些信息來實現。 我們將使用一個 docker-compose Spring 配置文件。 因此,我們將創建一個 application-docker-compose.yml 配置文件的內容:
spring:
docker:
compose:
enabled: true
file: docker-compose.yml4.3. 數據庫配置
我們不需要進行數據庫配置。Docker Compose 支持將創建一個默認配置。但是,我們仍然可以使用配置文件(例如)添加我們的 MongoDB 配置:
@Profile("!docker-compose")這樣一來,我們就可以選擇是否使用 Docker Compose 支持。如果未指定任何配置文件,應用程序將期望數據庫已經運行。
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. REST 控制器
最後,讓我們定義一個控制器,幷包含一些 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 配置文件。例如,通過命令行,我們可以使用 Spring Boot Maven 插件:
mvn spring-boot:run -Pdocker-compose -Dspring-boot.run.profiles=docker-compose我們還添加了一個專門的 Maven 構建配置文件 (-Pdocker-compose),以防將來存在類似需求。
現在,如果執行 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"
}為了進行數據庫檢查,我們添加一些項目,通過 POST 調用在端點 http://localhost:8080/item。例如,讓我們查看一個 curl POST 請求:
curl --location 'http://localhost:8080/item' \
--header 'Content-Type: application/json' \
--data '{
"name" : "Tennis Ball",
"quantity" : 5,
"category" : "sport"
}'我們將會收到帶有指定項目的響應:
{
"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-16. Docker Compose 支持功能
讓我們快速説明 Docker Compose 的主要支持功能 功能。
6.1. 服務連接
該支持將在啓動時自動發現若干服務。我們已觀察到 MongoDB。但還有 Redis 或 ElasticSearch 等其他服務。服務連接將查找並使用本地映射端口。我們可以跳過配置類或屬性。這由 Spring Boot 通過 <a href="https://spring.io/blog/2023/06/19/spring-boot-31-connectiondetails-abstraction">ConnectionDetails</a> 抽象實現。
6.2. 自定義鏡像
我們可以通過應用一個 標籤</em 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:
local6.3. 等待容器就緒
有趣的是,Spring Boot 3 將會自動檢查容器是否就緒。容器可能需要一些時間才能完全就緒。因此,該功能使我們能夠使用 健康檢查 命令來查看容器是否就緒。
6.4. 激活 Docker Compose 配置文件
我們可以在運行時在不同的 Docker Compose 配置文件之間切換。 我們的服務定義可能很複雜,因此我們可能希望選擇要啓用的配置文件,例如在調試或生產環境中。 我們可以通過使用配置屬性來實現這一點:
spring.docker.compose.profiles.active=myprofile7. Docker Compose 支持的優勢
在生產環境中,我們的 Docker 服務可以分佈在不同的實例上。因此,在這種情況下,我們可能不需要此支持。但是,我們可以激活一個 Spring 配置文件,從一個 docker-compose.yml 定義加載,僅用於本地開發。
此支持與我們的 IDE 完美集成,我們無需在命令行之間來回切換以啓動和停止 Docker 服務。
此支持從版本 3.1 開始。總的來説,已經有許多不錯的特性,例如多服務連接、默認的服務就緒檢查以及使用 Docker Compose 配置文件等。
8. 結論
在本文中,我們學習了 Spring Boot 3.1.0 中新增的 Docker Compose 支持。我們瞭解瞭如何使用它設置和創建 Spring Boot 3 應用。
遵循 Spring Boot 易於開發的特性,這項支持非常實用,並且已經具備了良好的功能。在啓動和停止應用程序時,Spring Boot 3 會管理我們的 Docker 服務生命週期。