提升自己
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 映象
cassandra
elasticsearch
gvenzl/oracle-xe
mariadb
mssql/server
mysql
postgres
mongo
rabbitmq
redis
openzipkin/zipkin
想自己嘗試一下嗎?我們已經準備了一些文件供您入門。
我們還在 start.spring.io 中添加了對 Docker Compose 的支援,讓您更快地入門!例如,如果您生成一個包含“Docker Compose 支援”和“PostgreSQL 驅動”依賴的專案,您將免費獲得一個合理的 compose.yaml
檔案!這不是很棒嗎?!
“好吧,好吧”,我聽到您說,“但是我們公司使用的自定義 Redis 映象怎麼辦?”我們已經為您考慮到了:您可以構建自己的映象,在其上新增標籤,然後 Spring Boot 會假裝它是官方映象。只需確保您使用的環境變數名稱與官方映象相同即可。
我們還支援忽略服務、名稱不尋常的 Docker Compose 檔案以及 Docker Compose 配置檔案(profiles)。
我們真誠地希望您喜歡新的 Docker Compose 功能!如果您希望看到更多服務得到支援,或有其他改進建議,請聯絡我們。