本教程系列介绍如何容器化Python Web 应用并将其部署到 Azure Container Apps。 示例 Web 应用已容器化,Docker 映像存储在 Azure Container Registry 中。 Azure Container Apps配置为从容器注册表拉取 Docker 映像并创建容器。 示例应用连接到 Azure Database for PostgreSQL,以演示容器应用和其他Azure资源之间的通信。
有几个选项可用于在 Azure 上生成和部署云原生和容器化Python Web 应用。 本教程系列介绍Azure Container Apps。 容器应用程序适合于运行通用容器,尤其适用于那些通过容器部署多微服务的应用程序。
在本教程系列中,将创建一个容器。 若要将 Python Web 应用作为容器部署到 Azure App Service,请参阅 在 Azure 上使用 MongoDB 的容器化 Python Web 应用。
本教程系列中的过程将指导你完成以下任务:
- 从 Python Web 应用生成 Docker 映像,并将映像存储在 Azure Container Registry 中。
- 配置 Azure Container Apps 以托管 Docker 映像。
- 设置 GitHub Actions,以在您的GitHub存储库发生更改时触发并用新的Docker映像更新容器。 此步骤是可选的。
- 设置Python Web应用的持续集成和持续交付(CI/CD)到Azure云平台。
本系列的第一部分介绍了在Azure Container Apps上部署Python Web 应用的基本概念。
服务概述
下图显示了如何使用本地环境、GitHub存储库和本教程系列中的Azure服务。
此图包含以下组件:
-
Azure Container Apps使你能够在无服务器平台上运行微服务和容器化应用程序。 无服务器平台意味着你可以享受运行容器的好处,只需最少的配置。 借助Azure Container Apps,应用程序可以根据 HTTP 流量、事件驱动处理或 CPU 或内存负载等特征动态缩放。
容器应用从Azure Container Registry拉取 Docker 映像。 对容器映像的更改会触发对已部署容器的更新。 还可以将GitHub Actions配置为触发更新。
-
Azure Container Registry使你能够在Azure中使用 Docker 映像。 由于容器注册表靠近Azure中的部署,因此你可以控制访问权限。 可以使用您的Microsoft Entra组和权限来控制对Docker镜像的访问。
在本教程系列中,注册表源是 Azure Container Registry。 但是,还可以使用Docker Hub或专用注册表进行轻微修改。
Azure Database for PostgreSQL:
示例代码将应用程序数据存储在 PostgreSQL 数据库中。 容器应用使用 用户分配的托管标识连接到 PostgreSQL。 连接信息存储在显式配置的环境变量中,或通过 Azure 服务连接器存储。
-
本教程系列的示例代码位于一个GitHub仓库中,您需要先派生该仓库并在本地克隆。 若要使用 GitHub Actions 设置 CI/CD 工作流,需要一个GitHub帐户。
如果在本地工作或使用 Azure Cloud Shell 从示例代码存储库生成容器映像,仍可以遵循本教程系列,而无需使用GitHub帐户。
修订和 CI/CD
若要进行代码更改并将其推送到容器,请使用更改创建新的 Docker 映像。 然后,将映像推送到容器注册表,并在容器应用中创建一个新的 修订版。
若要自动执行此过程,本教程系列中的可选步骤演示如何使用 GitHub Actions 生成 CI/CD 管道。 每当将新提交推送到GitHub存储库时,管道都会自动生成代码并将其部署到容器应用。
身份验证和安全性
在本教程系列中,你将直接在 Azure 中生成 Docker 容器映像并将其部署到Azure Container Apps。 容器应用在 环境 的上下文中运行,由 Azure 虚拟网络支持。 虚拟网络是 Azure 中专用网络的基本构建基块。 容器应用允许通过启用入口向公共 Web 公开容器应用。
若要设置 CI/CD,请将 Azure Container Apps 授权为 OAuth 应用 GitHub 帐户。 作为 OAuth 应用,容器应用会将GitHub Actions工作流文件写入存储库,其中包含有关Azure资源和作业的信息来更新它们。 工作流使用Microsoft Entra服务主体(或现有主体)的凭据更新Azure资源,该凭据具有容器应用的基于角色的访问权限,以及用于Azure Container Registry的用户名和密码。 凭据安全地存储在GitHub存储库中。
最后,本教程系列中的示例 Web 应用将数据存储在 PostgreSQL 数据库中。 示例代码通过connection string连接到 PostgreSQL。 应用在 Azure 中运行时,它使用用户分配的托管标识连接到 PostgreSQL 数据库。 代码使用 DefaultAzureCredential 在运行时使用Microsoft Entra访问令牌动态更新connection string中的密码。 此机制可防止需要对connection string或环境变量中的密码进行硬编码,并提供了额外的安全层。
本教程系列将指导你创建托管标识,并向其授予适当的 PostgreSQL 角色和权限,以便它可以访问和更新数据库。 在容器应用配置期间,本教程系列将指导你配置应用上的托管标识,并设置包含数据库的连接信息的环境变量。 还可以使用Azure服务连接器来完成相同的作。
先决条件
若要完成本教程系列,需要:
一个Azure账户,您可以在其中创建:
- Azure Container Registry实例。
- Azure Container Apps 环境。
- Azure Database for PostgreSQL实例。
Visual Studio Code 或 Azure CLI,具体取决于使用的工具:
- 对于 Visual Studio Code,您需要 Container Apps 扩展。
- 可以通过 Azure Cloud Shell 使用Azure CLI。
Python包:
- 用于连接到 PostgreSQL 的 psycopg2-binary。
- Flask 或 Django 作为 Web 框架。
示例应用
Python示例应用是一个餐厅评论应用,用于在PostgreSQL中保存餐馆及评论数据。 在教程系列结束时,你将在Azure Container Apps部署并运行一个餐馆评论应用,如以下屏幕截图所示。
&tl;c2><c1><c0><sb0>从 Python 容器化 web 应用程序创建的示例应用程序的截图</sb0></c0></c1></c2>