在 Azure 容器应用上部署 Flask 或 FastAPI Web 应用
本教程介绍如何容器化 Python Flask 或 FastAPI Web 应用并将其部署到 Azure 容器应用。 Azure 容器应用使用 Docker 容器技术来托管内置映像和自定义映像。 有关在 Azure 中使用容器的详细信息,请参阅 比较 Azure 容器选项。
本教程使用 Docker CLI 和 Azure CLI 创建 Docker 映像并将其部署到 Azure 容器应用。 还可以使用 Visual Studio Code 和 Azure 工具扩展进行部署。
先决条件
若要完成本教程,需要:
一个 Azure 帐户,可在其中将 Web 应用部署到 Azure 容器应用。 (在此过程中,将为你创建一个 Azure 容器注册表和 Log Analytics 工作区。)
获取示例代码
在本地环境中,获取代码。
添加 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
配置 gunicorn
Gunicorn 可以使用 gunicorn.conf.py 文件进行配置。 当 gunicorn.conf.py 文件位于运行 gunicorn
的同一目录中时,无需在 Dockerfile的 ENTRYPOINT
或 CMD
指令中指定其位置。 有关指定配置文件的详细信息,请参阅 Gunicorn 设置。
在本教程中,建议的配置文件将 GUnicorn 配置为根据可用的 CPU 核心数增加其工作进程数量。 有关 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
添加 .dockerignore 文件,以从映像中排除不必要的文件。
.git*
**/*.pyc
.venv/
在本地生成并运行映像
在本地生成映像。
在本地 Docker 容器中运行映像。
docker run --detach --publish 5000:50505 flask-demo
在浏览器中打开 http://localhost:5000
URL,查看在本地运行的 Web 应用。
--detach
选项在后台运行容器。 --publish
选项将容器端口映射到主机上的端口。 主机端口(外部)位于对中,容器端口(内部)为第二个。 有关详细信息,请参阅 Docker 运行参考。
将 Web 应用部署到 Azure
若要将 Docker 映像部署到 Azure 容器应用,请使用 az containerapp up 命令。 (Bash shell 显示了以下命令。 视其他 shell 的情况更改连续字符 (\
))。
az containerapp up \
--resource-group web-flask-aca-rg --name web-aca-app \
--ingress external --target-port 50505 --source .
当部署完成后,您将拥有一个包含以下资源的资源组:
- Azure 容器注册表
- 容器应用环境
- 运行 Web 应用映像的容器应用
- 日志分析工作区
已部署应用的 URL 位于 az containerapp up
命令的输出中。 在浏览器中打开 URL,查看在 Azure 中运行的 Web 应用。 URL 的形式类似于以下 https://web-aca-app.<generated-text>.<location-info>.azurecontainerapps.io
,其中 <generated-text>
和 <location-info>
是特定于您的部署的。
进行更新和重新部署
进行代码更新后,可以再次运行以前的 az containerapp up
命令,这会重新生成映像并将其重新部署到 Azure 容器应用。 再次运行该命令会考虑到资源组和应用已存在,并仅更新容器应用。
在更复杂的更新方案中,可以使用 az acr build 和 az containerapp update 命令一起重新部署,以更新容器应用。
清理
本教程中创建的所有 Azure 资源都位于同一资源组中。 删除资源组会删除资源组中的所有资源,这是删除用于应用的所有 Azure 资源的最快捷方法。
若要删除资源,请使用 az group delete 命令。
还可以删除 Azure 门户或 Visual Studio Code 和 Azure 工具扩展中的组。
后续步骤
有关详细信息,请参阅以下资源: