本教學課程說明如何使用適用於容器的 Web 應用程式功能,將 Python Flask 或 FastAPI Web 應用程式部署至 Azure App 服務。 這種方法為想要完全受控平臺優點的開發人員提供簡化的路徑,同時將其應用程式部署為包含所有相依性的單一容器化成品。 如需在 Azure 中使用容器的詳細資訊,請參閱 比較 Azure 容器選項。
在本教學課程中,您會使用 Docker CLI 和 Docker ,選擇性地在本機建置及測試 Docker 映像。 接著,您會使用 Azure CLI 將 Docker 映射推送至 Azure Container Registry (ACR),並將其部署至 Azure App Service。 web 應用程式使用由系統指派的 受管理的身分 進行配置,以便透過 Azure 角色型存取控制(RBAC)安全地無密碼存取,從 ACR 擷取映像。 您也可以使用安裝了Azure 工具延伸模組的Visual Studio Code進行部署。
如需建置和建立 Docker 映射以在 Azure Container Apps 上執行的範例,請參閱 在 Azure Container Apps 上部署 Flask 或 FastPI Web 應用程式。
注意
本教學課程示範如何建立可部署至 Azure App Service 的 Docker 映像。 不過,使用 Docker 映像檔並非部署至 App Service 的必要條件。 您也可以直接從本機工作區將應用程式程式代碼部署到 App Service,而不需要建立 Docker 映射。 如需範例,請參閱快速入門:將 Python(Django 或 Flask) Web 應用程式部署至 Azure App 服務。
必要條件
若要完成本教學課程,您需要:
Azure 帳戶,您可以在其中將 Web 應用程式部署至 Azure App 服務 和 Azure Container Registry。 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
Azure CLI 可建立 Docker 映像,並將其部署至 App Service。 此外, 您也可以選擇 Docker 和 Docker CLI 來建立 Docker,並在本機環境中進行測試。
取得範例程式碼
在您的本機環境中,取得程式碼。
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart
新增 Dockerfile 和 .dockerignore 檔案
新增 Dockerfile 以指示 Docker 如何建置映射。 Dockerfile 會指定 Gunicorn 的使用,這是將 Web 要求轉送至 Flask 和 FastAPI 架構的生產層級 Web 伺服器。 ENTRYPOINT 和 CMD 命令會指示 Gunicorn 處理應用程式物件的要求。
# syntax=docker/dockerfile:1
FROM python:3.11
WORKDIR /code
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
50505 用於此範例中的容器埠(內部),但您可以使用任何免費埠。
請檢查requirements.txt檔案,以確定它包含 gunicorn。
Flask==3.1.0
gunicorn
新增 .dockerignore 檔案,以從映射中排除不必要的檔案。
.git*
**/*.pyc
.venv/
設定 gunicorn
Gunicorn 可以使用 gunicorn.conf.py 檔案進行設定。 當 gunicorn.conf.py 檔案位於執行 gunicorn 的相同目錄中時,您不需要在 Dockerfile 中指定其位置。 如需指定組態檔的詳細資訊,請參閱 Gunicorn 設定。
在本教學課程中,建議的設定檔會根據可用的 CPU 核心數目來配置 Gunicorn,以增加其工作進程數量。 如需 gunicorn.conf.py 檔案設定的詳細資訊,請參閱 Gunicorn 組態。
# Gunicorn configuration file
import multiprocessing
max_requests = 1000
max_requests_jitter = 50
log_file = "-"
bind = "0.0.0.0:50505"
workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers
timeout = 120
在本機建置並執行映像
在本機建置映像。
注意
docker build如果命令傳回錯誤,請確定 docker deamon 正在執行。 在 Windows 上,確定 Docker Desktop 正在執行。
在本機的 Docker 容器中執行映像檔。
docker run --detach --publish 5000:50505 flask-demo
http://localhost:5000在瀏覽器中開啟 URL,以查看在本機執行的 Web 應用程式。
選項 --detach 會在背景中執行容器。 選項 --publish 會將容器埠對應至主機上的埠。 主機埠 (external) 是配對中的第一個埠,而容器埠 (internal) 則是第二個。 如需詳細資訊,請參閱 Docker 執行參考。
建立資源群組和 Azure 容器註冊表
執行 az login 命令以登入 Azure。
az login執行 az upgrade 命令,以確定您的 Azure CLI 版本是最新的。
az upgrade使用 az group create 命令建立群組。
RESOURCE_GROUP_NAME=<resource-group-name> LOCATION=<location> az group create --name $RESOURCE_GROUP_NAME --location $LOCATIONAzure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。 建立資源群組時,您可以指定 eastus 之類的位置。 請將
<location>替換為您選擇的位置。 某些庫存單位在特定地點無法使用,因此您可能會收到錯誤通知。 使用不同的位置,然後再試一次。使用 az acr create 命令建立 Azure Container Registry。 以實例的唯一名稱取代
<container-registry-name>。CONTAINER_REGISTRY_NAME=<container-registry-name> az acr create --resource-group $RESOURCE_GROOUP_NAME \ --name $CONTAINER_REGISTRY_NAME --sku Basic注意
登錄名稱在 Azure 中必須是唯一的。 如果您收到錯誤,請嘗試其他名稱。 登錄名稱可以包含5-50個英數位元。 不允許使用連字號和底線。 若要深入瞭解,請參閱 Azure Container Registry 名稱規則。 如果您使用不同的名稱,請確保您在下列各節使用涉及登錄和登錄工件的命令中使用的是您的名稱,而非
webappacr123。Azure Container Registry 是一個私人 Docker 登錄檔,用於儲存映像檔,以供 Azure Container Instances、Azure App 服務、Azure Kubernetes 服務及其他服務使用。 建立登錄時,您可以指定名稱、SKU 和資源群組。
在 Azure Container Registry 中建置映射
使用 az acr build 命令在 Azure 中建立 Docker 映像。 命令會使用目前目錄中的 Dockerfile,並將映像推送至登錄。
az acr build \
--resource-group $RESOURCE_GROUP_NAME \
--registry $CONTAINER_REGISTRY_NAME \
--image webappsimple:latest .
選項 --registry 會指定登錄名稱,而 --image 選項會指定映像名稱。 圖像名稱的格式為 registry.azurecr.io/repository:tag。
將 Web 應用程式部署至 Azure
使用 az appservice plan 命令建立 App Service 方案 。
az appservice plan create \ --name webplan \ --resource-group $RESOURCE_GROUP_NAME \ --sku B1 \ --is-linux將環境變數設定為您的訂用帳戶標識碼。 它會在下一個命令的 參數中使用
--scope。SUBSCRIPTION_ID=$(az account show --query id --output tsv)用於建立環境變數的命令針對 Bash 命令列界面顯示。 請根據不同環境適當地調整語法。
使用 az webapp create 命令建立 Web 應用程式。
export MSYS_NO_PATHCONV=1 # This line is for Windows users to prevent path conversion issues in Git Bash. az webapp create \ --resource-group $RESOURCE_GROUP_NAME \ --plan webplan --name <container-registry-name> \ --assign-identity [system] \ --role AcrPull \ --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME \ --acr-use-identity --acr-identity [system] \ --container-image-name $CONTAINER_REGISTRY_NAME.azurecr.io/webappsimple:latest注意:
Web 應用程式名稱在 Azure 中必須是唯一的。 如果您收到錯誤,請嘗試其他名稱。 名稱可以包含英數位元和連字元,但不能以連字元開頭或結尾。 若要深入瞭解,請參閱 Microsoft.Web 名稱規則。
如果您使用的名稱與
webappacr123Azure Container Registry 不同,請務必適當地更新--container-image-name參數。--assign-identity、--role和--scope參數會在 Web 應用程式上啟用系統指派的受控識別,並在資源群組上指派AcrPull角色。 這可賦予受控身份權限,從資源群組中的任何 Azure 容器登錄中提取映像檔。--acr-use-identity和--acr-identity參數會將 Web 應用程式設定為使用其系統指派的受控識別,從 Azure Container Registry 提取映像。建立 Web 應用程式可能需要幾分鐘的時間。 您可以使用 az webapp log tail 命令來檢查部署記錄。 例如:
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123。 如果您看到包含「warmup」的條目,則表示容器正在被部署。Web 應用程式的網址為
<web-app-name>.azurewebsites.net,例如https://webappsimple123.azurewebsites.net。
進行更新並重新部署
進行程式代碼變更之後,您可以使用 az acr build 和 az webapp update 命令重新部署至 App Service。
清理
本教學課程中建立的所有 Azure 資源都位於相同的資源群組中。 拿掉資源群組會移除資源群組中的所有資源,這是移除應用程式所用所有 Azure 資源最快的方式。
若要移除資源,請使用 az group delete 命令。
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
您也可以移除 Azure 入口網站 或 Visual Studio Code 和 Azure 工具擴充功能中的群組。
下一步
如需詳細資訊,請參閱以下資源: