領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多Spring Boot 3.1 中對 Docker Compose 的支援建立在
ConnectionDetails抽象之上,我們已在另一篇博文中介紹過它。如果您尚未閱讀,請在閱讀本文之前先閱讀該文章。
Docker Compose “是一個用於定義和執行多容器 Docker 應用程式的工具”。Docker Compose 配置檔案(通常命名為 docker-compose.yaml 或 compose.yaml)允許您定義服務。此類服務必須具有名稱和 Docker 映象。您還可以選擇定義環境變數、暴露的埠、標籤、服務之間的關係等等。
以下是一個簡單 Docker Compose 檔案的典型示例
services:
database:
image: 'postgres:15.2'
ports:
- '5432'
environment:
- 'POSTGRES_USER=myuser'
- 'POSTGRES_DB=mydatabase'
- 'POSTGRES_PASSWORD=secret'
它定義了一個名為 database 的服務,該服務使用 postgres:15.2 Docker 映象。它暴露了容器埠 5432(這是 PostgreSQL 的預設埠),Docker 將在啟動時選擇一個隨機的主機埠。此外,它定義了一些配置使用者、密碼和資料庫名稱的環境變數。
如果您在檔案所在的目錄中執行 docker compose up,Docker Compose 將首先檢查此服務是否已在執行。如果未執行,它將使用 postgres:15.2 映象啟動一個新容器並對其進行配置。
您現在可以執行 docker compose ps 並檢視容器已啟動
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
docker-compose-test-database-1 postgres:15.2 "docker-entrypoint.s…" database 7 seconds ago Up 6 seconds 0.0.0.0:32768->5432/tcp, :::32768->5432/tcp
要在 Spring Boot 3.1 之前的應用程式中針對該服務進行開發,您必須設定一些配置屬性,也許是在某種“開發者”配置檔案中
spring.datasource.url=jdbc:postgresql://:32768/mydatabase
spring.datasource.username=myuser
spring.datasource.password=secret
這會將 Spring Boot 配置為使用在 Docker 容器中執行的 PostgreSQL 資料庫(連線到主機埠 32768)。
當您使用完服務後,通常會執行 docker compose down 來停止並銷燬容器。但是當您再次啟動它們時,您會看到動態埠已更改
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
docker-compose-test-database-1 postgres:15.2 "docker-entrypoint.s…" database 4 minutes ago Up 1 second 0.0.0.0:32769->5432/tcp, :::32769->5432/tcp
哦不,這意味著您現在必須更新應用程式配置!
幸運的是,Docker Compose 為此提供了一個解決方案。不要使用隨機埠,使用固定主機埠
services:
database:
image: 'postgres:15.2'
ports:
- '15432:5432'
environment:
- 'POSTGRES_USER=myuser'
- 'POSTGRES_DB=mydatabase'
- 'POSTGRES_PASSWORD=secret'
現在,每次啟動容器時,它都可以在 localhost:15432 上訪問。
這可行,但存在另一個問題。如果您正在開發多個應用程式,每個應用程式都有自己的資料庫(這在微服務架構中很常見),您必須記住使用不同的主機埠。否則,某些 docker compose up 命令將失敗,因為埠已被佔用。
現在是好訊息。有了 Spring Boot 3.1,這將變得對您來說容易得多。您可以繼續使用隨機主機埠,但無需指定配置屬性,也無需在多個位置重複使用者名稱、密碼等。您也無需記住在啟動應用程式之前執行 docker compose up。
Spring Boot 3.1 將檢測是否存在 Docker Compose 檔案,並在連線到服務之前為您執行 docker compose up。如果服務已在執行,它也會檢測到並使用它們。當應用程式關閉時,它還將執行 docker compose stop —— 那些佔用您寶貴記憶體的殘留 Docker 容器的日子一去不復返了。
Docker Compose 啟動的映象會自動檢測並用於建立指向服務的 ConnectionDetails bean。這意味著您無需在配置中放置屬性,無需記住如何構造 PostgreSQL JDBC URL 等等。
有了 Spring Boot 3.1,您只需提供 compose.yaml 檔案,讓 Spring Boot 處理其餘部分。它就是能行!
截至撰寫本文時,我們支援 以下 Docker 映象
cassandraelasticsearchgvenzl/oracle-xemariadbmssql/servermysqlpostgresmongorabbitmqredisopenzipkin/zipkin想自己嘗試一下嗎?我們已準備了一些文件以幫助您入門。
我們還在 start.spring.io 中添加了對 Docker Compose 的支援,讓您更快入門!例如,如果您生成一個帶有“Docker Compose 支援”和“PostgreSQL 驅動”依賴項的專案,您將免費獲得一個合理的 compose.yaml!這不是很棒嗎?!
“好的,好的”,我聽到您說,“但是我們公司使用的自定義 Redis 映象怎麼辦?”。我們已經為您解決了:您可以構建自己的映象,給它打上標籤,Spring Boot 會假裝它是官方映象。只需確保您使用與官方映象相同的環境變數名稱。
我們還支援忽略服務、名稱不尋常的 Docker Compose 檔案和 Docker Compose 配置檔案。
我們真誠希望您喜歡新的 Docker Compose 功能!如果您希望支援更多服務,或者有其他改進想法,請聯絡我們。