共用方式為


在 Azure Container Apps 上使用 Open Liberty 部署 Java 應用程式

本文說明如何在 Azure Container Apps 上執行 Open Liberty。 您會在本文中執行下列活動:

  • 在 Open Liberty 運行時間上執行 Java、Java Enterprise Edition (EE)、Jakarta EE 或 MicroProfile 應用程式。
  • 使用 Liberty 容器映射建置應用程式 Docker 映射。
  • 將容器化應用程式部署至 Azure Container Apps。

如需 Open Liberty 的詳細資訊,請參閱 Open Liberty 專案頁面。 本文旨在協助您快速進行部署。 在進入生產環境之前,您應該先探索調整 Liberty

如果您想要提供意見反應,或與開發 Azure 解決方案 Java 的工程小組密切合作,請填寫 Azure 移轉 的簡短 問卷,並納入您的連絡資訊。 專案經理、結構設計師和工程師組成的小組會立即連絡您,以展開緊密合作。

必要條件

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • 準備已安裝 Windows 或類似 Unix 作業系統的本機電腦 ,例如 Ubuntu、macOS 或 Windows 子系統 Linux 版。
  • 安裝 Azure CLI 2.62.0 或更新版本以執行 Azure CLI 命令。
    • 如果出現提示,請在第一次使用時安裝 Azure CLI 延伸模組。 如需延伸模組的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
    • 執行 az version 以尋找已安裝的版本和相依連結庫。 若要升級至最新版本,請執行 az upgrade
  • 安裝 Java Standard Edition (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 資源所在的邏輯群組。

使用 java-liberty-project 位置中的 az group create 命令,建立名為 eastus2 的資源群組。 此資源群組稍後會用於建立 Azure Container Registry (ACR) 實例和 Azure Container Apps 實例。

export RESOURCE_GROUP_NAME=java-liberty-project
export LOCATION=eastus2
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

建立一個 ACR 執行個體

使用 az acr create 命令來建立 ACR 實例。 下列範例會建立名為 youruniqueacrname的 ACR 實例。 請確定在 Azure 中 youruniqueacrname 是唯一的。

備註

本文使用 Container Registry 的建議無密碼驗證機制。 使用 docker login 取得使用者名稱和密碼後,仍可以搭配 az acr credential show 使用此使用者名稱和密碼。 使用使用者名稱和密碼比無密碼驗證不安全。

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 \
    --location $LOCATION \
    --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 容器映像,將您的應用程式容器化為 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 20250327

如果您看到有關處於某個 detached HEAD 狀態的訊息,此訊息可以忽略。 這只是表示您查看了一個標籤。

本文使用 java-app。 以下是應用程式重要檔案的檔案結構:

java-app
├─ src/main/
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ Dockerfile
├─ pom.xml
├─ pom-azure-identity.xml

javaresourceswebapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 jdbc/JavaEECafeDB 的資料來源。

java-app 根目錄中,有一個 Dockerfile,可以透過 Open Liberty 建立應用程式映像。

liberty/config 目錄中,會使用 server.xml 檔案來設定 Open 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

  1. 使用 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
    
  2. 確認應用程式如預期般運作。 如果成功,您應該會在命令輸出中看到類似 [INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 11.086 seconds. 的訊息。 移至瀏覽器中 http://localhost:9080/,確認應用程式可存取且所有函式都正常運作。

  3. 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 伺服器連線到容器應用程式,方法是使用下列步驟:

  1. 在瀏覽器中開啟 Azure 入口網站,並流覽至您在上一個步驟中建立的 Azure Container Apps 實例。
  2. 在瀏覽窗格中,選取 [設定>服務連接器(預覽)]。
  3. 選取 ,創建。 您應該看到彈出視窗:建立連線
  4. 在 [基本] 窗格中,針對 [服務類型],選取 [SQL Database]。 針對 [用戶端類型],選取 [Java]。 保留其他欄位的預設值,然後選取 [ 下一步:驗證]。
  5. 在 [驗證] 窗格中,針對 [驗證類型],選取 [系統指派的受控識別],然後選取 [下一步:網络]。
  6. 在 [網络] 窗格中,選取 [下一步:檢閱 + 建立]。
  7. [檢閱 + 建立] 窗格中,等候驗證通過,然後選取 [在 Cloud Shell 上建立]。 Cloud Shell 隨即開啟,然後執行命令來建立連線。 等候命令完成,然後關閉 Cloud Shell。

備註

服務連接器會在容器應用程式中建立秘密,其中包含 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 Container Apps 上的 Java 自由應用程式。

清除資源

若要避免 Azure 費用,您應該清除不必要的資源。 不再需要叢集時,請使用 az group delete 命令來移除資源群組、容器登錄、容器應用程式、資料庫伺服器和所有相關資源。

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

下一步

您可以從本指南中使用的參考深入瞭解:

若要探索在 Azure 上執行 WebSphere 產品的選項,請參閱 在 Azure 上執行 WebSphere 產品系列的解決方案為何?