在 Azure 应用服务上部署容器化 Flask 或 FastAPI Web 应用
本教程介绍如何使用用于容器的 Web 应用功能将 Python Flask 或 FastAPI Web 应用部署到 Azure 应用程序服务。 用于容器的 Web 应用为想要利用完全托管的 Azure 应用程序服务平台,同时想要单个包含应用及其所有依赖项的可部署项目的开发人员提供了方便的入口。 有关在 Azure 中使用容器的更多信息,请参阅比较 Azure 容器选项。
在本教程中,你将使用 Docker CLI 和 Docker(可选)创建 Docker 映像并将其在本地测试。 使用 Azure CLI 在 Azure 容器注册表中创建 Docker 映像并将其部署到 Azure 应用程序服务。 Web 应用配置了其系统分配的托管标识(无密码连接)和 Azure 基于角色的访问,以在部署期间从 Azure 容器注册表拉取 Docker 映像。 还可以使用已安装 Azure 工具扩展的 Visual Studio Code 进行部署。
有关在 Azure 容器应用中生成和创建要运行的 Docker 映像的示例,请参阅在 Azure 容器应用中部署 Flask 或 FastPI Web 应用。
注意
本教程介绍如何创建可在应用程序服务上运行的 Docker 映像。 使用应用程序服务不需要这样做。 无需创建 Docker 映像,即可直接从本地工作区将代码部署到应用程序服务。 例如,请参阅快速入门:将 Python(Django 或 Flask)Web 应用部署到 Azure 应用程序服务。
先决条件
要完成本教程,您需要:
可将 Web 应用部署到 Azure 应用程序服务和 Azure 容器注册表的 Azure 帐户。 如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
Azure CLI 创建 Docker 映像并将其部署到应用程序服务。 (可选)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 服务器)将 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
命令返回错误,请确保 Docker 守护程序正在运行。 在 Windows 上,确保 Docker Desktop 正在运行。
在 Docker 容器中以本地方式运行映像。
docker run --detach --publish 5000:50505 flask-demo
在浏览器中打开 http://localhost:5000
URL,查看在本地运行的 Web 应用。
--detach
选项在后台运行容器。 --publish
选项将容器端口映射到主机上的端口。 主机端口(外部)是该对中的第一个,容器端口(内部)是第二个。 有关详细信息,请查看 Docker 运行参考。
创建资源组和 Azure 容器注册表
-
az login
运行 az upgrade 命令,确保 Azure CLI 的版本是最新的。
az upgrade
使用 az group create 命令创建组。
az group create --name web-app-simple-rg --location eastus
Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 在创建资源组时,你需要指定一个位置,例如 eastus。
使用 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
使用 az appservice plan 命令创建应用服务计划。
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
将环境变量设为订阅 ID。 它将在下一个命令的
--scope
参数中使用。SUBSCRIPTION_ID=$(az account show --query id --output tsv)
为 Bash shell 显示用于创建环境变量的命令。 根据其他环境更改语法。
使用 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 build 和 az webapp update 命令重新部署到应用程序服务。
清理
本教程中创建的所有 Azure 资源都在同一个资源组中。 删除资源组会删除资源组中的所有资源,这也是为应用删除所有 Azure 资源的最快方法。
若要删除资源,请使用 az group delete 命令。
az group delete --name web-app-simple-rg
还可以删除 Azure 门户或 Visual Studio Code 和 Azure 工具扩展中的组。
后续步骤
有关详细信息,请参阅以下资源: