使用 Azure Container Apps 和 PostgreSQL 建置和部署 Python Web 應用程式
本文是如何將 Python Web 應用程式容器化和部署至 Azure Container Apps 的教學課程的一部分。 Container Apps 可讓您部署容器化應用程式,而不需要管理複雜的基礎結構。
在本教學課程的這個部分中,您將瞭解如何容器化和部署 Python 範例 Web 應用程式(Django 或 Flask)。 具體而言,您會在雲端中建置容器映像,並將其部署至 Azure Container Apps。 您可以定義環境變數,讓容器應用程式能夠連線到 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器實例,其中範例應用程式會儲存數據。
此服務圖表醒目提示本文所涵蓋的元件:建置和部署容器映射。
取得範例應用程式
分叉並將範例程式代碼複製到您的開發人員環境。
步驟 1: 移至範例應用程式的 GitHub 存放庫(Django 或 Flask),然後選取 [分支]。
請遵循步驟將目錄分支至您的 GitHub 帳戶。 您也可以直接將程式代碼存放庫下載到本機計算機,而不需分手或 GitHub 帳戶,不過,您將無法設定本教學課程稍後討論的 CI/CD。
步驟 2。 使用 git clone 命令,將分支存放庫複製到 python-container 資料夾:
# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container
# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container
步驟 3: 變更目錄。
cd python-container
從 Web 應用程式程式代碼建置容器映像
遵循這些步驟之後,您將會有一個 Azure Container Registry,其中包含從範例程式代碼建置的 Docker 容器映像。
Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI 的工作站上執行。
步驟 1: 使用 az group create 命令來建立資源群組。
az group create \
--name pythoncontainer-rg \
--location <location>
<location> 是命令az account list-locations -o table
輸出的其中一個 Azure 位置 Name 值。
步驟 2。 使用 az acr create 命令建立容器登錄。
az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled
<registry-name> 在 Azure 內必須是唯一的,且包含 5-50 個英數位元。
您可以使用下列項目來檢視為系統管理員建立的認證:
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
步驟 3: 使用 az acr login 命令登入登錄。
az acr login --name <registry-name>
命令會將 「azurecr.io」 新增至名稱,以建立完整登錄名稱。 如果成功,您會看到「登入成功」訊息。 如果您要從與建立登錄所在的訂用帳戶不同的訂用帳戶存取登錄,請使用 --suffix
參數。
步驟 4. 使用 az acr build 命令建 置映像。
az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .
請注意:
命令結尾的點 (“.”) 表示要建置的原始碼位置。 如果您未在範例應用程式根目錄中執行此命令,請指定程式代碼的路徑。
如果您在 Azure Cloud Shell 中執行 命令,請使用
git clone
先將存放庫提取到 Cloud Shell 環境,然後將目錄變更為專案的根目錄,以便正確解譯點 (“.”)。如果您省略 [
-t
相同--image
] 選項,命令會將本機內容組建排入佇列,而不會將它推送至登錄。 在沒有推送的情況下建置對於檢查映像是否建置很有用。
步驟 5: 使用 az acr repository list 命令確認容器映射已建立。
az acr repository list --name <registry-name>
建立 PostgreSQL 彈性伺服器實例
範例應用程式 (Django 或 Flask) 會將餐廳檢閱資料儲存在 PostgreSQL 資料庫中。 在這些步驟中,您會建立將包含資料庫的伺服器。
Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI 的工作站上執行。
步驟 1: 使用 az postgres flexible-server create 命令在 Azure 中建立 PostgreSQL 伺服器。 此命令執行幾分鐘才能完成並不罕見。
az postgres flexible-server create \
--resource-group pythoncontainer-rg \
--name <postgres-server-name> \
--location <location> \
--admin-user <admin-username> \
--admin-password <admin-password> \
--sku-name Standard_D2s_v3 \
--public-access 0.0.0.0
“pythoncontainer-rg” →本教學課程中使用的資源組名。 如果您使用不同的名稱,請變更此值。
<postgres-server-name> → PostgreSQL 資料庫伺服器名稱。 此名稱在所有 Azure 中都必須是唯一的。 伺服器端點為 「https://< postgres-server-name.postgres.database.azure.com>」。。 允許的字元為 “A”-“Z”、“0”-“9” 和 “-”。
<位置> → 使用用於 Web 應用程式的相同位置。 <location> 是命令
az account list-locations -o table
輸出的其中一個 Azure 位置 Name 值。<admin-username> →系統管理員帳戶的用戶名稱。 它不能是 “azure_superuser”、“admin”、“administrator”、“root”、“guest” 或 “public”。 在本教學課程中使用 「demoadmin」。
<系統管理員使用者的 admin-password 密碼> 。 其必須包含 8 到 128 個字元,且來自下列類別的其中三個類別:英文大寫字母、英文小寫字母、數字及非英數字元。
重要
建立使用者名稱或密碼 時,不會 使用 “$” 字元。 稍後,您會使用這些值建立環境變數,其中 “$” 字元在用來執行 Python 應用程式的 Linux 容器中具有特殊意義。
<sku-name>
→定價層和計算組態的名稱,例如“Standard_D2s_v3”。 如需詳細資訊,請參閱適用於 PostgreSQL 的 Azure 資料庫定價。 若要列出可用的 SKU, 請使用az postgres flexible-server list-skus --location <location>
。<public-access>
→使用 「0.0.0.0」,允許從任何 Azure 服務公開存取伺服器,例如 Container Apps。
注意
如果您打算使用 Azure CLI 以外的工具從本機工作站使用 PostgreSQL 伺服器,您必須使用 az postgres flexible-server firewall-rule create 命令來新增防火牆規則。
在伺服器上建立資料庫
此時,您有 PostgreSQL 伺服器。 在本節中,您會在伺服器上建立資料庫。
您可以在本機環境中,或在 Azure Cloud Shell 中使用 PostgreSQL 互動式終端機 psql,這也可以在 Azure 入口網站 中存取。 使用 psql 時,使用 Cloud Shell 通常比較容易,因為殼層中包含所有相依性。
步驟 1: 使用 psql 連線到資料庫。
psql --host=<postgres-server-name>.postgres.database.azure.com \
--port=5432 \
--username=demoadmin@<postgres-server-name> \
--dbname=postgres
其中 <postgres-server-name> 是 PostgreSQL 伺服器的名稱。 此命令會提示您輸入系統管理員密碼。
如果您無法連線,請重新啟動資料庫,然後再試一次。 如果您要從本機環境連線,您的IP位址必須新增至資料庫服務的防火牆規則清單。
步驟 2。 建立資料庫。
在 postgres=>
提示字元中輸入:
CREATE DATABASE restaurants_reviews;
命令結尾的分號 (“;”) 是必要的。 若要確認資料庫已成功建立,請使用 命令 \c restaurants_reviews
。 輸入 \?
以顯示說明或 \q
結束。
您也可以連線到 Azure PostgreSQL 彈性伺服器,並使用 Azure Data Studio 或任何其他支援 PostgreSQL 的 IDE 來建立資料庫。
將 Web 應用程式部署至容器應用程式
容器應用程式會部署至容器應用程式 環境,其可作為安全界限。 在下列步驟中,您會建立環境、環境內的容器,並設定容器,讓網站在外部可見。
步驟 1: 視需要登入 Azure 並進行驗證。
az login
步驟 2。 使用 az extension add 命令安裝或升級 Azure Container Apps 的擴充功能。
az extension add --name containerapp --upgrade
步驟 3: 使用 az containerapp env create 命令建立 Container Apps 環境。
az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>
<location> 是命令az account list-locations -o table
輸出的其中一個 Azure 位置 Name 值。
步驟 4. 取得 Azure Container Registry 的登入認證。
az acr credential show -n <registry-name>
使用使用者名稱和命令輸出傳回的其中一個密碼。
步驟 5: 使用 az containerapp create 命令在環境中建立 容器應用程式。
az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn
<env-variable-string> 是由 key=“value” 格式中空格分隔值的字串,其中包含下列值。
- AZURE_POSTGRESQL_HOST=<postgres-server-name.postgres.database.azure.com>
- AZURE_POSTGRESQL_DATABASE=restaurants_reviews
- AZURE_POSTGRESQL_USERNAME=demoadmin
- AZURE_POSTGRESQL_PASSWORD=<db-password>
- RUNNING_IN_PRODUCTION=1
- AZURE_SECRET_KEY=<YOUR-SECRET-KEY>
使用的python -c 'import secrets; print(secrets.token_hex())'
輸出產生AZURE_SECRET_KEY
值。
範例如下:--env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf
。
步驟 7。 僅限 Django,請移轉和建立資料庫架構。 (在 Flask 範例應用程式中,它會自動完成,您可以略過此步驟。
使用 az containerapp exec 命令進行連線:
az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg
然後,在殼層命令提示字元中輸入 python manage.py migrate
。
您不需要移轉容器的修訂。
步驟 8。 測試網站。
az containerapp create
您先前輸入的命令會輸出可用來瀏覽至應用程式的應用程式URL。 URL 結尾為 「azurecontainerapps.io」。。 瀏覽至瀏覽器中的 URL。 或者,您可以使用 az containerapp browse 命令。
以下是新增餐廳后範例網站和兩個評論的範例。
針對部署進行疑難排解
您忘記了應用程式 URL 來存取網站。
- 在 Azure 入口網站 中,移至容器應用程式的 [概觀] 頁面,並尋找應用程式 URL。
- 在 VS Code 中 ,移至 Azure 檢視 (Ctrl+Shift+A),然後展開您正在使用的訂用帳戶。 展開 [ 容器應用程式 ] 節點,然後展開受控環境,然後以滑鼠右鍵按兩下 python-container-app ,然後選取 [ 瀏覽]。 它會使用 應用程式 URL 開啟瀏覽器。
- 在 Azure CLI 中,使用
az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn
命令。
在 VS Code 中,Azure 工作中建置映像會傳回錯誤。
- 如果您看到「錯誤:無法下載內容」訊息。 請檢查 URL 是否不正確。“在 VS Code 輸出 視窗中,然後重新整理 Docker 延伸模組中的登錄。 若要重新整理,請選取 Docker 擴充功能,移至 [登錄] 區段,尋找登錄並加以選取。
- 如果您再次在 Azure 中執行建置映像,請檢查先前執行中的登錄是否存在,如果是的話,請使用它。
在建立容器應用程式期間 Azure 入口網站 中,您會看到包含「無法存取 ACR 』<name.azurecr.io>』」 的存取錯誤。
- 當 ACR 上的系統管理員認證停用時,就會發生此錯誤。 若要在入口網站中檢查系統管理員狀態,請移至您的 Azure Container Registry,選取 存取密鑰 資源,並確定 已啟用系統管理員使用者 。
您的容器映像不會出現在 Azure Container Registry 中。
- 檢查 Azure CLI 命令或 VS Code 輸出的輸出,並尋找訊息以確認成功。
- 使用 Azure CLI 或 VS Code 工作提示,檢查您的組建命令中已正確指定登錄的名稱。
- 請確定您的認證未過期。 例如,在 VS Code 中,在 Docker 擴充功能中尋找目標登錄並重新整理。 在 Azure CLI 中,執行
az login
。
網站會傳回「不正確的要求(400)」。
- 檢查傳入至容器的PostgreSQL環境變數。 400 錯誤通常表示 Python 程式代碼無法連線到 PostgreSQL 實例。
- 本教學課程中使用的範例程式代碼會檢查容器環境變數
RUNNING_IN_PRODUCTION
是否存在,其可設定為任何值,例如 “1”。
網站會傳回「找不到」(404)。
- 檢查容器的 [概觀] 頁面上的應用程式 URL。 如果應用程式 URL 包含 「internal」 這個字,則輸入未正確設定。
- 檢查容器的輸入。 例如,在 Azure 入口網站 中,移至容器的輸入資源,並確定已啟用 HTTP 輸入,並選取 [接受來自任何地方的流量]。
網站未啟動,您會看到「串流逾時」,或未傳回任何專案。
- 檢查記錄。
- 在 Azure 入口網站 中,移至容器應用程式的修訂管理資源,並檢查容器的 [布建狀態]。
- 如果為「布建」,請等到布建完成為止。
- 如果為「失敗」,請選取修訂並檢視控制台記錄。 選擇要顯示「產生時間」、「Stream_s」和「Log_s」的數據行順序。 先依最新的記錄排序,並在 「Stream_s」 資料行中尋找 Python stderr 和 stdout 訊息。 Python 'print' 輸出將會是 stdout 訊息。
- 使用 Azure CLI 時,請使用 az containerapp logs show 命令。
- 在 Azure 入口網站 中,移至容器應用程式的修訂管理資源,並檢查容器的 [布建狀態]。
- 如果使用 Django 架構,請檢查資料庫中是否有 restaurants_reviews 數據表。 如果沒有,請使用主控台來存取容器並執行
python manage.py migrate
。
- 檢查記錄。