在 Azure Container Apps 上使用 Open Liberty 或 WebSphere Liberty 部署 Java 應用程式
本文說明如何在 Azure Container Apps 上執行 Open Liberty 或 WebSphere Liberty。 您會在本文中執行下列活動:
- 在 Open Liberty 或 WebSphere Liberty 執行階段上執行 JAVA、JAVE EE、Jakarta EE 或 MicroProfile 應用程式。
- 使用 Liberty 容器映射建置應用程式 Docker 映射。
- 將容器化應用程式部署至 Azure Container Apps。
如需 Open Liberty 的詳細資訊,請參閱 Open Liberty 專案頁面。 如需 IBM WebSphere Liberty 的詳細資訊,請參閱 WebSphere Liberty 產品頁面。
本文旨在協助您快速進行部署。 移至實際執行環境之前,您應該先探索微調 Liberty (英文)。
若您有興趣與開發 Azure 上 WebSphere 解決方案的工程團隊緊密合作以進行移轉,請填寫這份簡短的 WebSphere 移轉問卷,並附上您的連絡資訊。 專案經理、結構設計師和工程師組成的小組會立即連絡您,以展開緊密合作。
必要條件
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
- 準備已安裝 Windows 或類似 Unix 作業系統的本機電腦 ,例如 Ubuntu、macOS 或 Windows 子系統 Linux 版。
-
安裝 Azure CLI 2.62.0 或更新版本以執行 Azure CLI 命令。
- 使用 Azure CLI,透過
az login
命令登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱 使用 Azure CLI 登入 Azure。 - 出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需延伸模組的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
- 執行
az version
以尋找已安裝的版本和相依連結庫。 若要升級至最新版本,請執行az upgrade
。
- 使用 Azure CLI,透過
- 安裝 Java SE 實作版本 17 - 例如,Microsoft OpenJDK組建。
- 安裝 Maven 3.9.8 或更高版本。
- 確定 已安裝 Git 。
登入 Azure
使用 az login
命令登入您的 Azure 訂用帳戶,並遵循螢幕上的指示。
az login
注意
您可以在 PowerShell 中執行大部分的 Azure CLI 命令,與 Bash 中的命令相同。 只有在使用變數時,差異才會存在。 在下列各節中,差異會在需要時在不同的索引卷標中解決。
如果您有多個與 Azure 認證相關聯的 Azure 租使用者,您必須指定您要登入的租使用者。 您可以使用 [--tenant
] 選項來指定租使用者,例如 az login --tenant contoso.onmicrosoft.com
。
如果您在單一租用戶內有多個訂用帳戶,請確定使用 az account set --subscription <subscription-id>
登入您想要使用的帳戶。
建立資源群組
Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。
使用 eastus2
位置中的 az group create
命令,建立名為 java-liberty-project
的資源群組。 此資源群組稍後會用於建立 Azure Container Registry (ACR) 實例和 Azure Container Apps 實例。
export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus2
建立 ACR 執行個體
使用 az acr create
命令來建立 ACR 實例。 下列範例會建立名為 youruniqueacrname
的 ACR 實例。 請確定在 Azure 中 youruniqueacrname
是唯一的。
注意
本文使用 Container Registry 的建議無密碼驗證機制。 使用 az acr credential show
取得使用者名稱和密碼後,仍可以搭配 docker login
使用此使用者名稱和密碼。 使用使用者名稱和密碼比無密碼驗證不安全。
export REGISTRY_NAME=youruniqueacrname
az acr create \
--resource-group $RESOURCE_GROUP_NAME \
--name $REGISTRY_NAME \
--sku Basic
在短時間內,您應該會看到包含下列幾行的 JSON 輸出:
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "java-liberty-project",
接下來,使用下列命令來擷取 Container Registry 實例的登入伺服器。 當您稍後將應用程式映射部署至 Azure Container Apps 時,需要此值。
export ACR_LOGIN_SERVER=$(az acr show \
--resource-group $RESOURCE_GROUP_NAME \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv)
建立環境
Azure 容器應用程式中的環境會在容器應用程式群組周圍建立安全界限。 部署至相同環境的容器應用程式會部署在相同的虛擬網路中,並將記錄寫入相同的 Log Analytics 工作區。 使用 az containerapp env create
命令來建立環境。 下列範例會建立名為 youracaenvname
的環境:
export ACA_ENV=youracaenvname
az containerapp env create \
--resource-group $RESOURCE_GROUP_NAME \
--name $ACA_ENV
如果系統要求您安裝擴充功能,請回答 Y。
在短時間內,您應該會看到包含下列幾行的 JSON 輸出:
"provisioningState": "Succeeded",
"type": "Microsoft.App/managedEnvironments"
"resourceGroup": "java-liberty-project",
在 Azure SQL Database 中建立單一資料庫
在本節中,您會在 Azure SQL Database 中建立單一資料庫,以搭配您的應用程式使用。
首先,使用下列命令來設定資料庫相關的環境變數。 以 Azure SQL Database 伺服器的唯一名稱取代 <your-unique-sql-server-name>
。
export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb
接下來,使用下列命令在 Azure SQL Database 中建立單一資料庫,並將目前的登入使用者設定為 Microsoft Entra 管理員。如需詳細資訊,請參閱 快速入門:建立單一資料庫 - Azure SQL Database。
export ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)
az sql server create \
--name $SQL_SERVER_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--enable-ad-only-auth \
--external-admin-principal-type User \
--external-admin-name $ENTRA_ADMIN_NAME \
--external-admin-sid $(az ad signed-in-user show --query id --output tsv)
az sql db create \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name $DB_NAME \
--edition GeneralPurpose \
--compute-model Serverless \
--family Gen5 \
--capacity 2
然後,使用下列命令將本機 IP 位址新增至 Azure SQL Database 伺服器防火牆規則,以允許本機電腦稍後連線到資料庫以進行本機測試。
export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)
az sql server firewall-rule create \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name AllowLocalIP \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS
注意
您可以針對安全性考慮,建立已停用 SQL 驗證的 Azure SQL Server。 只有Microsoft Entra標識碼可用來向伺服器進行驗證。 如果您需要啟用 SQL 驗證,請參閱 az sql server create
。
設定和建置應用程式映像
若要在 Azure Container Apps 上部署和執行您的 Liberty 應用程式,請使用 Open Liberty 容器映射或 WebSphere Liberty 容器映像,將您的應用程式容器化為 Docker 映射。
請依照本節的步驟,在 Liberty 執行階段上部署應用程式範例。 這些步驟會使用 Maven。
查看應用程式
使用下列命令來準備本指南的範例程序代碼。 此範例位於 GitHub 上。
git clone https://github.com/Azure-Samples/open-liberty-on-aca.git
cd open-liberty-on-aca
export BASE_DIR=$PWD
git checkout 20241118
如果您看到有關處於狀態的 detached HEAD
訊息,則此訊息是安全的忽略。 這只是表示您查看了一個標籤。
本文使用 java-app。 以下是應用程式重要檔案的檔案結構:
java-app
├─ src/main/
│ ├─ liberty/config/
│ │ ├─ server.xml
│ ├─ java/
│ ├─ resources/
│ ├─ webapp/
├─ Dockerfile
├─ Dockerfile-wlp
├─ pom.xml
├─ pom-azure-identity.xml
java、resources 及 webapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 jdbc/JavaEECafeDB
的資料來源。
在 java 應用程式 根目錄中,有兩個檔案可透過 Open Liberty 或 WebSphere Liberty 來建立應用程式映像。
在 liberty/config 目錄中,server.xml 檔案可用來設定 Open Liberty 和 WebSphere Liberty 叢集的資料庫連線。 它會定義用來連線到 Azure SQL Database 的變數 azure.sql.connectionstring
。
pom.xml 檔案是 Maven 項目物件模型 (POM) 檔案,其中包含專案的組態資訊。
pom-azure-identity.xml 檔案會宣告 azure-identity
相依性,用來使用 Microsoft entra ID 向 Azure 服務進行驗證。
注意
此範例會使用 azure-identity
程式庫,使用 Microsoft Entra 認證 Azure SQL Database,建議使用這種方法進行驗證以考量到安全性。 如果您需要在 Liberty 應用程式中使用 SQL 驗證,請參閱 使用 JDBC 進行關係資料庫連線。
建置專案
使用下列命令來建置應用程式:
cd $BASE_DIR/java-app
mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources
如果建置成功,您應該會在組建結尾看到類似下列的輸出。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 22.651 s
[INFO] Finished at: 2023-10-26T18:58:40-04:00
[INFO] ------------------------------------------------------------------------
如果您看不到此輸出,則請先進行疑難排解並解決問題,再繼續進行。
在本機測試您的專案
您現在可以使用下列步驟在本機執行和測試專案,再部署至 Azure。 為了方便起見,請使用 liberty-maven-plugin
。 若要深入了解 liberty-maven-plugin
,請參閱使用 Maven 建置 Web 應用程式。 針對您的應用程式,您可以使用任何其他機制 (例如,您的本機 IDE) 來執行類似的作業。
注意
如果您選取了「無伺服器」資料庫部署,請確認您的 SQL 資料庫未進入暫停模式。 執行驗證的其中一種方式是登入資料庫查詢編輯器,如 快速入門中所述:使用 Azure 入口網站查詢編輯器 (預覽) 來查詢 Azure SQL Database。
使用
liberty:run
啟動應用程式。cd $BASE_DIR/java-app # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by the configuration variable azure.sql.connectionstring in server.xml. export AZURE_SQL_CONNECTIONSTRING="jdbc:sqlserver://$SQL_SERVER_NAME.database.windows.net:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault" mvn liberty:run
確認應用程式如預期般運作。 如果成功,您應該會在命令輸出中看到類似
[INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 11.086 seconds.
的訊息。 移至瀏覽器中http://localhost:9080/
,確認應用程式可存取且所有函式都正常運作。按 Ctrl+C 來停止。 如果您被要求終止批次作業,請選取 [Y]。
當您完成時,請使用下列命令,刪除允許本機 IP 位址存取 Azure SQL Database 的防火牆規則:
az sql server firewall-rule delete \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name AllowLocalIP
建置 Azure Container Apps 部署的映像
您現在可以執行 az acr build
命令來建置映像,如下列範例所示:
cd $BASE_DIR/java-app
az acr build \
--registry ${REGISTRY_NAME} \
--image javaee-cafe:v1 \
.
az acr build
命令會將 Dockerfile 中指定的成品上傳至 Container Registry 實例、建置映像,並將其儲存在 Container Registry 實例中。
將應用程式部署至 Azure Container Apps
使用下列命令建立 Azure Container Apps 實例,以在從 ACR 提取映射之後執行應用程式。 此範例會建立名為 youracainstancename
的 Azure Container Apps 實例:
export ACA_NAME=youracainstancename
az containerapp create \
--resource-group $RESOURCE_GROUP_NAME \
--name $ACA_NAME \
--image ${ACR_LOGIN_SERVER}/javaee-cafe:v1 \
--environment $ACA_ENV \
--registry-server $ACR_LOGIN_SERVER \
--registry-identity system \
--target-port 9080 \
--ingress 'external' \
--min-replicas 1
成功的輸出是 JSON 物件,包括 屬性 "type": "Microsoft.App/containerApps"
。
然後,使用 Service Connector 將 Azure SQL Database 伺服器連線到容器應用程式,方法是使用下列步驟:
此範例會使用 Service Connector 來協助連線到資料庫。 如需 Service Connector 的詳細資訊,請參閱 什麼是 Service Connector? 使用下列命令安裝 Azure CLI 的無密碼擴充功能:
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
使用下列命令,使用系統指派的受控識別,將資料庫連線到容器應用程式:
az containerapp connection create sql \ --resource-group $RESOURCE_GROUP_NAME \ --name $ACA_NAME \ --target-resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --database $DB_NAME \ --system-identity \ --container $ACA_NAME \ --client-type java
成功的輸出是 JSON 物件,包括 屬性
"type": "microsoft.servicelinker/linkers"
。
注意
服務連接器會在容器應用程式中建立秘密,其中包含 AZURE_SQL_CONNECTIONSTRING
的值,這是 Azure SQL Database 的無密碼連接字串。 如需詳細資訊,請參閱 整合 Azure SQL Database 與 Service Connector中 使用者指派的受控識別 一節中的範例值。
測試應用程式
使用下列命令取得完整網址以存取應用程式:
echo https://$(az containerapp show \
--resource-group $RESOURCE_GROUP_NAME \
--name $ACA_NAME \
--query properties.configuration.ingress.fqdn \
--output tsv)
若要存取及測試應用程式,請開啟URL的網頁瀏覽器。 下列螢幕快照顯示執行中的應用程式:
清除資源
若要避免 Azure 費用,您應該清除不必要的資源。 不再需要叢集時,請使用 az group delete
命令來移除資源群組、容器登錄、容器應用程式、資料庫伺服器和所有相關資源。
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
下一步
您可以從本指南中使用的參考深入瞭解:
- Azure 容器應用程式
- 整合 Azure SQL Database 與 Service Connector
- 使用 Microsoft Entra 驗證 連線
- Open Liberty
- 開啟 [Liberty 伺服器設定]
- Liberty Maven 外掛程式
- 開啟 Liberty 容器映像
- WebSphere Liberty 容器映像
若要探索在 Azure 上執行 WebSphere 產品的選項,請參閱 在 Azure 上執行 WebSphere 產品系列的解決方案為何?