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

本教程介绍如何使用用于容器的 Web 应用功能将 Python FlaskFastAPI Web 应用部署到Azure App 服务 用于容器的 Web 应用为开发人员提供了一个轻松的 on-ramp,以利用完全托管的Azure App 服务平台,但还需要包含应用及其所有依赖项的单个可部署项目。 有关在 Azure 中使用容器的详细信息,请参阅 比较 Azure 容器选项

在本教程中,你将使用 Docker CLIDocker (可选)创建 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 服务

先决条件

要完成本教程,您需要:

获取示例代码

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

git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git

添加 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 deamon 正在运行。 在 Windows 上,确保 Docker Desktop 正在运行。

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

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

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

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

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

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

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

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

  2. 使用 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 命令将密码保存到变量。 密码用于在后面的步骤中向注册表进行身份验证。

  3. 将环境变量设置为注册表的密码值。

    $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 门户获取密码,ACR_PASSWORD方法是转到注册表,选择“访问密钥”,然后复制密码。

在 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 命令创建App 服务计划

    az appservice plan create \
    --name webplan \
    --resource-group web-app-simple-rg \
    --sku B1 \
    --is-linux
    
  2. 使用 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 名称规则

    • 如果使用的名称与webappacr123Azure 容器注册表不同,请确保正确更新--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.nethttps://webappsimple123.azurewebsites.netURL。

进行更新和重新部署

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

清理

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

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

az group delete --name web-app-simple-rg

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

后续步骤

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