Spring Boot 3.1 中的 Docker Compose 支援

工程 | Moritz Halbritter | 2023 年 6 月 21 日 | ...

Spring Boot 3.1 中的 Docker Compose 支援構建在 ConnectionDetails 抽象之上,我們已經在一篇單獨的部落格文章中介紹過它。如果您還沒有閱讀過,請在閱讀本文之前先閱讀那篇文章。

Docker Compose “是一個用於定義和執行多容器 Docker 應用的工具”。Docker Compose 配置檔案,通常命名為 docker-compose.yamlcompose.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 映象

想自己嘗試一下嗎?我們已經準備了一些文件供您入門

我們還在 start.spring.io 中添加了對 Docker Compose 的支援,讓您更快地入門!例如,如果您生成一個包含“Docker Compose 支援”和“PostgreSQL 驅動”依賴的專案,您將免費獲得一個合理的 compose.yaml 檔案!這不是很棒嗎?!

“好吧,好吧”,我聽到您說,“但是我們公司使用的自定義 Redis 映象怎麼辦?”我們已經為您考慮到了:您可以構建自己的映象,在其上新增標籤,然後 Spring Boot 會假裝它是官方映象。只需確保您使用的環境變數名稱與官方映象相同即可。

我們還支援忽略服務、名稱不尋常的 Docker Compose 檔案以及 Docker Compose 配置檔案(profiles)

我們真誠地希望您喜歡新的 Docker Compose 功能!如果您希望看到更多服務得到支援,或有其他改進建議,請聯絡我們

獲取 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

提升自己

VMware 提供培訓和認證,助您加速發展。

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視全部