共用方式為


在 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
  • 安裝 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

javaresourceswebapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 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

  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. 此範例會使用 Service Connector 來協助連線到資料庫。 如需 Service Connector 的詳細資訊,請參閱 什麼是 Service Connector? 使用下列命令安裝 Azure CLI 的無密碼擴充功能:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  2. 使用下列命令,使用系統指派的受控識別,將資料庫連線到容器應用程式:

    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 Container Apps 上的 Java 自由應用程式。

清除資源

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

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

下一步

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

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