取得領先優勢
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://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 映像
cassandra
elasticsearch
gvenzl/oracle-xe
mariadb
mssql/server
mysql
postgres
mongo
rabbitmq
redis
openzipkin/zipkin
想要自己試試嗎? 我們準備了一些文件來幫助您入門。
我們還將 Docker Compose 支援新增到 start.spring.io,讓您更快上手! 例如,如果您產生一個包含「Docker Compose 支援」和「PostgreSQL 驅動程式」相依性的專案,您將免費獲得一個合理的 compose.yaml
! 這是不是棒呆了?!
「好啦,好啦」,我聽到您說,「但我們公司使用的自訂 Redis 映像呢?」。 我們已為您提供解決方案:您可以建立自己的映像,在其上放置一個標籤,Spring Boot 將假裝它是官方映像。 只要確保您使用與官方映像相同的環境變數名稱即可。
我們還支援 忽略服務、Docker Compose 具有不尋常名稱的檔案和 Docker Compose 設定檔。
我們真的希望您喜歡新的 Docker Compose 功能! 如果您想看到支援更多服務,或有其他改善方法的想法,請與我們聯繫。