在 Azure 应用服务上部署容器化 Flask 或 FastAPI Web 应用
本教程介绍如何使用用于容器的 Web 应用功能将 Python Flask 或 FastAPI Web 应用部署到Azure App 服务。 用于容器的 Web 应用为开发人员提供了一个轻松的 on-ramp,以利用完全托管的Azure App 服务平台,但还需要包含应用及其所有依赖项的单个可部署项目。 有关在 Azure 中使用容器的详细信息,请参阅 比较 Azure 容器选项。
在本教程中,你将使用 Docker CLI 和 Docker (可选)创建 Docker 映像并将其在本地测试。 此外,可以使用 Azure CLI 在 Azure 中创建 Docker 映像并将其部署到Azure App 服务。 还可以使用已安装 Azure 工具扩展的 Visual Studio Code 进行部署。 有关在 Azure 容器应用中生成和创建要运行的 Docker 映像的示例,请参阅 在 Azure 容器应用中部署 Flask 或 FastPI Web 应用。
注意
本教程介绍如何创建可在App 服务上运行的 Docker 映像。 这不需要使用App 服务。 无需创建 Docker 映像,即可直接从本地工作区将代码部署到App 服务。 有关示例,请参阅快速入门:将 Python(Django 或 Flask)Web 应用部署到Azure App 服务。
先决条件
要完成本教程,您需要:
可将 Web 应用部署到Azure App 服务和Azure 容器注册表的 Azure 帐户。
用于创建 Docker 映像并将其部署到App 服务的 Azure CLI。 (可选) Docker和 Docker CLI ,用于创建 Docker 并在本地环境中对其进行测试。
获取示例代码
在本地环境中,获取代码。
添加 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 deamon 正在运行。 在 Windows 上,确保 Docker Desktop 正在运行。
在 Docker 容器中以本地方式运行映像。
docker run --detach --publish 5000:50505 flask-demo
在 http://localhost:5000
浏览器中打开 URL,查看在本地运行的 Web 应用。
该 --detach
选项在后台运行容器。 此选项 --publish
将容器端口映射到主机上的端口。 主机端口(外部)位于对中,容器端口(内部)为第二个。 有关详细信息,请查看 Docker 运行参考。
创建资源组和Azure 容器注册表
使用 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 --admin-enabled true
注意
注册表名称在 Azure 中必须是唯一的。 如果收到错误,请尝试其他名称。 注册表名称可以包含 5-50 个字母数字字符。 不允许连字符和下划线。 若要了解详细信息,请参阅Azure 容器注册表名称规则。 如果使用其他名称,请确保使用名称,而不是
webappacr123
在以下部分中引用注册表和注册表项目的命令中使用。Azure 容器注册表是一个专用 Docker 注册表,用于存储用于Azure 容器实例、Azure App 服务、Azure Kubernetes 服务和其他服务的映像。 创建注册表时,请指定名称、SKU 和资源组。 第二个命令使用 az credential show 命令将密码保存到变量。 密码用于在后面的步骤中向注册表进行身份验证。
将环境变量设置为注册表的密码值。
$ACR_PASSWORD=(az acr credential show \ --resource-group web-app-simple-rg \ --name webappacr123 \ --query "passwords[?name == 'password'].value" \ --output tsv)
为 Bash shell 显示用于创建环境变量的命令。 根据其他 shell 更改语法和延续字符(
\
)。
在 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 命令创建App 服务计划。
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
使用 az webapp create 命令创建 Web 应用。
az webapp create \ --resource-group web-app-simple-rg \ --plan webplan --name webappsimple123 \ --docker-registry-server-password $ACR_PASSWORD \ --docker-registry-server-user webappacr123 \ --role acrpull \ --deployment-container-image-name webappacr123.azurecr.io/webappsimple:latest
注意:
Web 应用名称在 Azure 中必须是唯一的。 如果收到错误,请尝试其他名称。 该名称可以包含字母数字字符和连字符,但不能以连字符开头或结尾。 若要了解详细信息,请参阅 Microsoft.Web 名称规则。
如果使用的名称与
webappacr123
Azure 容器注册表不同,请确保正确更新--docker-registry-server-user
和--deployment-container-image-name
参数。创建 Web 应用可能需要几分钟时间。 可以使用 az webapp log tail 命令检查部署日志。 例如
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123
。 如果在其中看到带有“热身”的条目,则会部署容器。例如,Web 应用的
<web-app-name>.azurewebsites.net
https://webappsimple123.azurewebsites.net
URL。
进行更新和重新部署
进行代码更改后,可以使用 az acr build 和 az webapp update 命令重新部署到App 服务。
清理
本教程中创建的所有 Azure 资源都位于同一资源组中。 删除资源组会删除资源组中的所有资源,这是删除用于应用的所有 Azure 资源的最快捷方法。
若要删除资源,请使用 az group delete 命令。
az group delete --name web-app-simple-rg
还可以删除Azure 门户或 Visual Studio Code 和 Azure 工具扩展中的组。
后续步骤
有关详细信息,请参阅以下资源: