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://127.0.0.1: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 Compose 啟動的映像會自動偵測並用於建立指向服務的 ConnectionDetails beans。 這表示您不必將屬性放入配置中,也不必記住如何建構 PostgreSQL JDBC URL 等。

透過 Spring Boot 3.1,您只需提供 compose.yaml 檔案,然後讓 Spring Boot 找出其餘的。 它就是可以運作!

在撰寫本文時,我們支援 以下 Docker 映像

想要自己試試嗎? 我們準備了一些文件來幫助您入門

我們還將 Docker Compose 支援新增到 start.spring.io,讓您更快上手! 例如,如果您產生一個包含「Docker Compose 支援」和「PostgreSQL 驅動程式」相依性的專案,您將免費獲得一個合理的 compose.yaml! 這是不是棒呆了?!

「好啦,好啦」,我聽到您說,「但我們公司使用的自訂 Redis 映像呢?」。 我們已為您提供解決方案:您可以建立自己的映像,在其上放置一個標籤,Spring Boot 將假裝它是官方映像。 只要確保您使用與官方映像相同的環境變數名稱即可。

我們還支援 忽略服務、Docker Compose 具有不尋常名稱的檔案和 Docker Compose 設定檔

我們真的希望您喜歡新的 Docker Compose 功能! 如果您想看到支援更多服務,或有其他改善方法的想法,請與我們聯繫

獲取 Spring 電子報

透過 Spring 電子報保持聯繫

訂閱

取得領先優勢

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

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

了解更多

即將舉辦的活動

查看 Spring 社群中所有即將舉辦的活動。

檢視全部