在 Azure 应用服务上部署容器化 Flask 或 FastAPI Web 应用

本教程介绍如何使用用于容器的 Web 应用功能将 Python FlaskFastAPI Web 应用部署到 Azure 应用程序服务。 此方法为想要完全托管平台的优势的开发人员提供了简化的路径,同时将其应用部署为包含所有依赖项的单个容器化项目。 有关在 Azure 中使用容器的更多信息,请参阅比较 Azure 容器选项

在本教程中,你将使用 Docker CLIDocker 在本地生成和测试 Docker 映像( 可选)。 然后,使用 Azure CLI 将 Docker 映像推送到 Azure 容器注册表 (ACR),并将其部署到 Azure 应用服务。 Web 应用配置了其系统分配的托管标识,以便通过 Azure 基于角色的访问控制(RBAC)从 ACR 安全地、无密码地拉取镜像。 还可以使用已安装 Azure 工具扩展Visual Studio Code 进行部署。

有关在 Azure 容器应用中生成和创建要运行的 Docker 映像的示例,请参阅在 Azure 容器应用中部署 Flask 或 FastPI Web 应用

注意

本教程演示如何创建可部署到 Azure 应用服务的 Docker 映像。 但是,无需使用 Docker 映像即可部署到应用服务。 还可以直接从本地工作区将应用程序代码部署到应用服务,而无需创建 Docker 映像。 例如,请参阅快速入门:将 Python(Django 或 Flask)Web 应用部署到 Azure 应用程序服务

先决条件

要完成本教程,您需要:

获取示例代码

在本地环境中,获取代码。

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 服务器)将 Web 请求转发到 Flask 和 FastAPI 框架。 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.conf.py 文件配置 Gunicorn。 当 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 --tag flask-demo .

注意

如果 docker build 命令返回错误,请确保 Docker 守护程序正在运行。 在 Windows 上,确保 Docker Desktop 正在运行。

在 Docker 容器中以本地方式运行映像。

docker run --detach --publish 5000:50505 flask-demo

在浏览器中打开 http://localhost:5000 URL,查看在本地运行的 Web 应用。

--detach 选项在后台运行容器。 --publish 选项将容器端口映射到主机上的端口。 主机端口(外部)是该对中的第一个,容器端口(内部)是第二个。 有关详细信息,请查看 Docker 运行参考

创建资源组和 Azure 容器注册表

  1. 运行 az login 命令,以登录到 Azure

    az login
    
  2. 运行 az upgrade 命令,确保 Azure CLI 的版本是最新的。

    az upgrade
    
  3. 使用 az group create 命令创建组。

    RESOURCE_GROUP_NAME=<resource-group-name>
    LOCATION=<___location>
    az group create --name $RESOURCE_GROUP_NAME --___location $LOCATION
    

    Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 创建资源组时,可以指定一个位置,例如 eastus。 将 <___location> 替换为所选位置。 某些 SKU 在某些位置不可用,因此你可能会收到指示此情况的错误。 使用其他位置,然后重试。

  4. 使用 az acr create 命令创建 Azure 容器注册表。 请将 <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 容器注册表名称规则。 如果使用其他名称,请确保在以下部分中引用注册表和注册表工件的命令中使用你的名称而不是 webappacr123

    Azure 容器注册表是一个专用 Docker 注册表,用于存储用于 Azure 容器实例、Azure 应用程序服务、Azure Kubernetes 服务和其他服务的映像。 创建注册表时,请指定名称、SKU 和资源组。

在 Azure 容器注册表中生成映像

使用 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

  1. 使用 az appservice plan 命令创建应用服务计划。

    az appservice plan create \
    --name webplan \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux
    
  2. 将环境变量设为订阅 ID。 它将在下一个命令的 --scope 参数中使用。

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    

    为 Bash shell 显示用于创建环境变量的命令。 根据其他环境更改语法。

  3. 使用 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 名称规则

    • 如果你为 Azure 容器注册表使用的名称不同于 webappacr123,请确保适当更新 --container-image-name 参数。

    • --assign-identity--role--scope 参数在 Web 应用上启用系统分配的托管标识,并在资源组上为其分配 AcrPull 角色。 这为托管标识提供从资源组中的任何 Azure 容器注册表拉取映像的权限。

    • --acr-use-identity--acr-identity 参数将 Web 应用配置为使用其系统分配的托管标识从 Azure 容器注册表中拉取映像。

    • 创建 Web 应用可能需要几分钟的时间。 可以使用 az webapp log tail 命令检查部署日志。 例如,az webapp log tail --resource-group web-app-simple-rg --name webappsimple123。 如果在其中看到带有“预热”的条目,则会部署容器。

    • Web 应用的 URL 为 <web-app-name>.azurewebsites.net,例如 https://webappsimple123.azurewebsites.net

进行更新和重新部署

进行代码更改后,可以使用 az acr buildaz webapp update 命令重新部署到应用程序服务。

清理

本教程中创建的所有 Azure 资源都在同一个资源组中。 删除资源组会删除资源组中的所有资源,这也是为应用删除所有 Azure 资源的最快方法。

若要删除资源,请使用 az group delete 命令。

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

还可以删除 Azure 门户Visual Studio CodeAzure 工具扩展中的组。

后续步骤

有关详细信息,请参阅以下资源: