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

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

在本教程中,你将使用 Docker CLIDocker(可选)创建 Docker 映像并将其在本地测试。 使用 Azure CLIAzure 容器注册表中创建 Docker 映像并将其部署到 Azure 应用程序服务。 Web 应用配置了其系统分配的托管标识(无密码连接)和 Azure 基于角色的访问,以在部署期间从 Azure 容器注册表拉取 Docker 映像。 还可以使用已安装 Azure 工具扩展Visual Studio Code 进行部署。

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

注意

本教程介绍如何创建可在应用程序服务上运行的 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==2.2.2
gunicorn
Werkzeug==2.2.2

添加 .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 命令创建组。

    az group create --name web-app-simple-rg --location eastus
    

    Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 在创建资源组时,你需要指定一个位置,例如 eastus

  4. 使用 az acr create 命令创建 Azure 容器注册表。

    az acr create --resource-group web-app-simple-rg \
    --name webappacr123 --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 web-app-simple-rg \
  --registry webappacr123 \
  --image webappsimple:latest .

--registry 选项指定注册表名称,--image 选项指定映像名称。 映像名称采用格式 registry.azurecr.io/repository:tag

将 Web 应用部署到 Azure

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

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

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

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

  3. 使用 az webapp create 命令创建 Web 应用。

    az webapp create \
    --resource-group web-app-simple-rg \
    --plan webplan --name webappsimple123 \
    --assign-identity [system] \
    --role AcrPull \
    --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/web-app-simple-rg \
    --acr-use-identity --acr-identity [system] \
    --container-image-name webappacr123.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 web-app-simple-rg

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

后续步骤

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