Azure 中的 Python 容器应用概述

本文介绍如何采用 Python 项目(例如 Web 应用程序),并将其部署为 Azure 中的 Docker 容器。 其中介绍了常规容器化工作流、适用于容器的 Azure 部署选项以及 Azure 中特定于 Python 的容器配置。 在 Azure 中生成和部署 Docker 容器遵循跨语言的标准过程,Dockerfile 中特定于 Python 的配置、requirements.txt以及 DjangoFlaskFastAPI 等 Web 框架的设置。

容器工作流方案

对于 Python 容器开发,下表讨论了一些用于从代码移动到容器的典型工作流。

情景 DESCRIPTION 工作流程
开发 在开发环境中本地生成 Python Docker 映像。 代码:使用 Git 在本地克隆应用代码(已安装 Docker)。

生成:使用 Docker CLI、VS Code(带扩展)、PyCharm(使用 Docker 插件)。 在“ 使用 Python Docker 映像和容器”部分中介绍。

测试:在本地运行和测试容器。

推送:将映像推送到容器注册表,例如 Azure 容器注册表、Docker 中心或专用注册表。

部署:将容器从注册表部署到 Azure 服务。
混合 在 Azure 中生成 Docker 映像,但从本地环境启动该过程。 代码:在本地克隆代码(不需要安装 Docker)。

构建:若要在 Azure 中触发构建,请使用带有远程扩展的 VS Code 或 Azure CLI。

推送:将生成的映像推送到 Azure 容器注册表。

部署:将容器从注册表部署到 Azure 服务。
天蓝色 使用 Azure Cloud Shell 完全在云中生成和部署容器。 代码:在 Azure Cloud Shell 中克隆 GitHub 存储库。

生成:在 Cloud Shell 中使用 Azure CLI 或 Docker CLI。

推送:将映像推送到 Azure 容器注册表、Docker 中心或专用注册表等注册表。

部署:将容器从注册表部署到 Azure 服务。

这些工作流的最终目标是,让一个容器在支持 Docker 容器的 Azure 资源中运行,具体资源将在下一部分列出。

开发环境可以是:

Azure 中的部署容器选项

以下服务支持 Python 容器应用。

服务 DESCRIPTION
用于容器的 Web 应用 Azure 应用服务是一个完全托管的托管平台,适用于容器化 Web 应用程序,包括网站和 Web API。 它支持可缩放的部署,并使用 Docker Hub、Azure 容器注册表和 GitHub 与 CI/CD 工作流无缝集成。 此服务非常适合希望部署容器化应用的简单高效路径的开发人员,同时受益于 Azure 应用服务平台的全部功能。 通过将应用程序及其所有依赖项打包到单个可部署容器中,可以同时获得可移植性和易于管理的功能,而无需管理基础结构。

示例: 在 Azure 应用服务上部署 Flask 或 FastPI Web 应用
Azure 容器应用 (ACA) Azure 容器应用(ACA)是由 Kubernetes 和开源技术(如 DaprKEDAenvoy)提供支持的完全托管的无服务器容器服务。 其设计结合了行业最佳做法,并针对执行常规用途容器进行优化。 ACA 抽象化了管理 Kubernetes 基础结构的复杂性-不需要或支持对 Kubernetes API 的直接访问。 相反,它提供更高级别的应用程序构造,例如修订、缩放、证书和环境,以简化开发和部署工作流。 此服务非常适合希望生成和部署容器化微服务的开发团队,只需最少的作开销,即可专注于应用程序逻辑,而不是基础结构管理。

示例: 在 Azure 容器应用上部署 Flask 或 FastPI Web 应用
Azure 容器实例 (ACI) Azure 容器实例 (ACI) 是一种无服务器产品/服务,可按需提供 Hyper-V 独立容器的单个 Pod。 计费基于实际资源消耗,而不是预先分配的基础结构,使其非常适合短期或可突发工作负荷。 与其他容器服务不同,ACI 不包括对缩放、负载均衡或 TLS 证书等概念的内置支持。 相反,它通常充当基础容器构建模块,通常与 Azure Kubernetes 服务(AKS)等 Azure 服务集成,用于编排。 当 Azure 容器应用的更高级别抽象和功能不需要时,ACI 表现出色,作为轻量级选择。 例如:
。 (本教程不是特定于 Python 的,但显示的概念适用于所有语言。
Azure Kubernetes 服务 (AKS) Azure Kubernetes 服务(AKS)是 Azure 中完全托管的 Kubernetes 选项,可让你完全控制 Kubernetes 环境。 它支持直接访问 Kubernetes API,并且可以运行任何标准 Kubernetes 工作负荷。 整个群集位于你的订阅中,群集配置和操作都由你控制和负责。 ACI 非常适合寻求完全托管容器解决方案的团队,而 AKS 则让你完全控制 Kubernetes 群集,需要你管理配置、网络、缩放和操作。 Azure 处理控制平面和基础结构预配,但群集的日常作和安全性在团队的控制范围内。 此服务非常适合希望 Kubernetes 的灵活性和强大功能且具有 Azure 托管基础结构的附加优势的团队,同时仍保持对群集环境的完全所有权。

示例: 使用 Azure CLI 部署 Azure Kubernetes 服务群集
Azure 函数 Azure Functions 提供事件驱动的无服务器函数即服务(FaaS)平台,使你能够在响应事件时运行少量代码(函数),而无需管理基础结构。 Azure Functions 与 Azure 容器应用共享许多特征,这些特征围绕缩放和与事件集成,但针对部署为代码或容器的短期函数进行了优化。 适合希望触发事件执行函数的团队;例如,绑定到其他数据源。 与 Azure 容器应用一样,Azure Functions 支持自动缩放和与事件源(例如 HTTP 请求、消息队列或 Blob 存储更新)集成。 此服务非常适合团队构建轻量级、事件触发的工作流,例如处理文件上传或响应 Python 或其他语言的数据库更改。

示例: 使用自定义容器在 Linux 上创建函数

有关这些服务的更详细比较,请参阅 将容器应用与其他 Azure 容器选项进行比较

虚拟环境和容器

Python 中的虚拟环境将项目依赖项与系统级别的 Python 安装隔离开来,确保开发环境的一致性。 虚拟环境包括自己的独立 Python 解释器,以及运行该环境中特定项目代码所需的库和脚本。 Python 项目的依赖项通过 requirements.txt 文件进行管理。 通过在 requirements.txt 文件中指定依赖项,开发人员可以重现其项目所需的确切环境。 此方法有助于更顺畅地过渡到容器化部署,例如 Azure 应用服务,其中环境一致性对于可靠的应用程序性能至关重要。

小窍门

在容器化 Python 项目中,虚拟环境通常是不必要的,因为 Docker 容器为独立环境提供自己的 Python 解释器和依赖项。 但是,可以使用虚拟环境进行本地开发或测试。 若要使 Docker 映像保持精简状态,请使用 .dockerignore 文件排除虚拟环境,从而阻止将不必要的文件复制到映像中。

可以将 Docker 容器视为提供类似于 Python 虚拟环境的功能,但在可重现性、隔离性和可移植性方面具有更广泛的优势。 与虚拟环境不同,只要容器运行时可用,Docker 容器就可以在不同的作系统和环境之间一致地运行。

Docker 容器包括 Python 项目代码及其运行所需的一切,例如依赖项、环境设置和系统库。 若要创建容器,首先从项目代码和配置生成 Docker 映像,然后启动容器,该容器是该映像的可运行实例。

对于容器化 Python 项目,下表描述了关键文件:

项目文件 DESCRIPTION
requirements.txt 此文件包含应用程序所需的 Python 依赖项的明确列表。 Docker 在映像生成过程中使用此列表来安装所有必需的包。 这可确保开发和部署环境之间的一致性。
Dockerfile 此文件包含生成 Python Docker 映像的说明,包括基础映像选择、依赖项安装、代码复制和容器启动命令。 它定义应用程序的完整执行环境。 有关详细信息,请参阅 Python 的 Dockerfile 说明部分。
.dockerignore 此文件指定使用 Dockerfile 中的命令将内容复制到 Docker 映像 COPY 时应排除的文件和目录。 此文件使用类似于 .gitignore 的模式来定义排除项。 .dockerignore 文件支持类似于 .gitignore 文件的排除模式。 有关详细信息,请参阅 .dockerignore 文件

排除不必要的文件有助于提升镜像构建性能,但也应被用来避免将敏感信息添加到可能被检查或暴露的镜像中。 例如, .dockerignore 应包含忽略 .env.venv (虚拟环境)的行。

Web 框架的容器设置

Web 框架通常绑定到默认端口(例如 5000 for Flask,8000 for FastAPI)。 将容器部署到 Azure 服务(例如 Azure 容器实例、Azure Kubernetes 服务(AKS)或用于容器的应用服务时,必须显式公开和配置容器的侦听端口,以确保正确路由入站流量。 配置正确的端口可确保 Azure 的基础结构可以将请求定向到容器内的正确终结点。

Web 框架 港口
Django 8,000
5000 或 5002
FastAPIuvicorn 8000 或 80

下表显示了如何为不同的 Azure 容器解决方案设置端口。

Azure 容器解决方案 如何设置 Web 应用端口
用于容器的 Web 应用 默认情况下,应用服务假定自定义容器正在侦听端口 80 或端口 8080。 如果容器侦听其他端口,请在应用服务应用中设置 WEBSITES_PORT 应用设置。 有关详细信息,请参阅 为 Azure 应用服务配置自定义容器
Azure 容器应用 通过启用入口,Azure 容器应用可让你将容器应用公开到公共 Web、虚拟网络或同一环境中的其他容器应用。 将入口 targetPort 设置为容器侦听传入请求的端口。 应用程序入口终结点始终在端口 443 上公开。 有关详细信息,请参阅 在 Azure 容器应用中设置 HTTPS 或 TCP 入口
Azure 容器实例、Azure Kubernetes 您在创建容器或 Pod 时定义应用正在侦听的端口。 容器映像应包括 Web 框架、应用程序服务器(例如 gunicorn、uvicorn)和 Web 服务器(例如 nginx)。 在更复杂的方案中,可以跨两个容器(一个用于应用程序服务器)拆分职责,另一个用于 Web 服务器。 在这种情况下,Web 服务器容器通常会公开端口 80 或 443 供外部流量使用。

Python Dockerfile

Dockerfile 是一个文本文件,其中包含为 Python 应用程序生成 Docker 映像的说明。 通常,第一个指令会指定要从哪个基础镜像开始。 随后的说明详细说明了安装必要的软件、复制应用程序文件以及配置环境以创建可运行映像等作。 下表提供了常用 Dockerfile 指令的 Python 特定示例。

说明 目的 示例:
为后续指令设置基本映像。 FROM python:3.8-slim
暴露 告知 Docker 容器在运行时侦听指定端口。 EXPOSE 5000
复制 从指定的源复制文件或目录,并将其添加到位于指定目标路径的容器的文件系统中。 COPY . /app
在 Docker 映像中运行命令。 例如,导入依赖项。 该命令在生成时运行一次。 RUN python -m pip install -r requirements.txt
CMD 该命令提供用于执行容器的默认值。 只能有一个 CMD 指令。 CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Docker build 命令根据 Dockerfile 和上下文生成 Docker 映像。 生成上下文是位于指定路径或 URL 中的文件集。 通常,从 Python 项目的根目录生成映像,生成命令的路径为“.”,如以下示例所示。

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

生成过程可以引用上下文中的任何文件。 例如,生成可以使用 COPY 指令来引用上下文中的文件。 下面是使用 Flask 框架的 Python 项目的 Dockerfile 示例:

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

可以手动创建 Dockerfile,也可以使用 VS Code 和 Docker 扩展自动创建它。 有关详细信息,请参阅 生成 Docker 文件

Docker 生成命令是 Docker CLI 的一部分。 使用 VS Code 或 PyCharm 等 IDE 时,用于处理 Docker 映像的 UI 命令会为你调用生成命令,并自动指定选项。

使用 Python Docker 映像和容器

VS Code 和 PyCharm

集成开发环境(例如 Visual Studio Code(VS Code)和 PyCharm 通过将 Docker 任务集成到工作流中来简化 Python 容器开发。 借助扩展或插件,这些 IDE 可简化生成 Docker 映像、运行容器以及部署到 Azure 服务(如应用服务或容器实例)。 下面是可以使用 VS Code 和 PyCharm 完成的一些任务。

  • 下载并生成 Docker 映像。

    • 在开发环境中生成映像。
    • 在 Azure 中生成 Docker 映像,而无需在开发环境中安装 Docker。 (对于 PyCharm,请使用 Azure CLI 在 Azure 中生成映像。
  • 从现有映像、拉取映像或直接从 Dockerfile 创建和运行 Docker 容器。

  • 使用 Docker Compose 运行多容器应用程序。

  • 连接和使用容器注册表,例如 Docker Hub、GitLab、JetBrains Space、Docker V2 和其他自承载 Docker 注册表。

  • (仅限 VS Code)添加为 Python 项目定制的 Dockerfile 和 Docker compose 文件。

若要设置 VS Code 和 PyCharm 以在开发环境中运行 Docker 容器,请使用以下步骤。

如果尚未安装,请安装 适用于 VS Code 的 Azure 工具

说明书 屏幕截图
步骤 1:使用 SHIFT + ALT + A 打开 Azure 扩展并确认已连接到 Azure。

还可以选择 VS Code 扩展栏上的 Azure 图标。

如果未登录,请选择“ 登录到 Azure ”,然后按照提示进行作。

如果在访问 Azure 订阅时遇到问题,则可能是因为使用了代理。 若要解决连接问题,请参阅 Visual Studio Code 中的网络连接
显示 Azure 工具登录后的外观的屏幕截图。 显示未登录时 Azure 工具的外观的屏幕截图。
步骤 2:使用 CTRL + SHIFT + X 打开 扩展、搜索 Docker 扩展并安装扩展。

还可以选择 VS Code 扩展栏上的 “扩展 ”图标。
显示如何将 Docker 扩展添加到 VS Code 的屏幕截图。
步骤 3:在扩展栏中选择 Docker 图标,展开映像,然后右键单击 Docker 映像以容器的形式运行它。 显示如何在 VS Code 中使用 Docker 扩展从 Docker 映像运行容器的屏幕截图。
步骤 4:在 终端 窗口中监视 Docker 运行输出。 显示在 VS Code 中运行容器的示例的屏幕截图。

Azure CLI 和 Docker CLI

还可以使用 Azure CLIDocker CLI 处理 Python Docker 映像和容器。 VS Code 和 PyCharm 都有终端,你可以在其中运行这些 CLIs。

如果希望更好地控制生成和运行参数以及实现自动化,请使用 CLI。 例如,以下命令演示如何使用 Azure CLI az acr build 指定 Docker 映像名称。

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

作为另一个示例,请考虑以下命令,该命令演示如何使用 Docker CLI 运行 命令。 该示例演示如何在容器外部运行与开发环境中的 MongoDB 实例通信的 Docker 容器。 在命令行中指定时,完成命令的不同值更易于自动执行。

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

有关此方案的详细信息,请参阅 在本地生成和测试容器化 Python Web 应用

容器中的环境变量

Python 项目通常使用环境变量将配置数据传递到应用程序代码中。 此方法允许在不同的环境中实现更大的灵活性。 例如,数据库连接详细信息可以存储在环境变量中,因此无需修改代码即可轻松地在开发、测试和生产数据库之间进行切换。 这种配置与代码分离可促进更简洁的部署,并提高安全性和可维护性。

python-dotenv 等包通常用于从 .env 文件中读取键值对,并将其设置为环境变量。 在虚拟环境中运行时, .env 文件非常有用,但在使用容器时不建议这样做。 不要将 .env 文件复制到 Docker 映像中,尤其是在它包含敏感信息且容器将公开时。 使用 .dockerignore 文件将文件从复制到 Docker 映像中排除。 有关详细信息,请参阅本文中的 虚拟环境和容器 部分。

可以通过多种方式将环境变量传递到容器:

  1. 在 Dockerfile 中定义为 ENV 指令。
  2. 在 Docker --build-arg 命令中作为 参数传入。
  3. 在 Docker 构建命令和 --secret 后端中作为参数传入。
  4. 通过 Docker --env 命令作为 --env-file 参数传入。

前两个选项的缺点与 .env 文件相同,即将潜在的敏感信息硬编码到 Docker 映像中。 可以检查 Docker 映像并查看环境变量,例如,使用命令 docker 映像检查

BuildKit 的第三个选项允许你传递要在 Dockerfile 中使用的机密信息,以便以安全的方式生成 docker 镜像,而这些信息最终不会存储在最终映像中。

使用 Docker run 命令传入环境变量的第四个选项意味着 Docker 映像不包含变量。 然而,变量在检查容器实例时仍然可见,例如,可以通过docker container inspect命令查看。 在访问容器实例受到控制时,或在测试或开发场景中,此选项可能是可接受的。

下面是使用 Docker CLI run 命令和 --env 参数传递环境变量的示例。

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

在 VS Code(Docker 扩展)或 PyCharm(Docker 插件)中,UI 工具通过在后台执行标准 docker CLI 命令(如 docker 生成、docker 运行)来简化 Docker 映像和容器的管理。

最后,在 Azure 中部署容器时指定环境变量不同于在开发环境中使用环境变量。 例如:

  • 对于用于容器的 Web 应用,可以在配置应用服务期间配置应用程序设置。 这些设置可以作为环境变量提供给应用代码,并使用标准的 os.environ 模式进行访问。 如果需要,可以在初始部署后更改值。 有关详细信息,请参阅 Access 应用设置作为环境变量

  • 对于 Azure 容器应用,可以在容器应用的初始配置过程中配置环境变量。 环境变量的后续修改会创建容器的 修订版 。 此外,Azure 容器应用允许在应用程序级别定义机密,然后在环境变量中引用它们。 有关详细信息,请参阅管理 Azure 容器应用中的机密

作为另一个选项,可以使用 服务连接器 将 Azure 计算服务连接到其他支持服务。 此服务在计算服务和管理平面中目标支持服务之间配置网络设置和连接信息(例如生成环境变量)。

查看容器日志

查看容器实例日志,查看代码输出的诊断消息,并排查容器代码中的问题。 下面是在 开发环境中运行容器时查看日志的几种方法:

  • 使用 VS Code 或 PyCharm 运行容器,如 VS Code 和 PyCharm 部分所示,可以在 Docker 运行时打开的终端窗口中查看日志。

  • 如果使用 Docker CLI run 命令和交互式标志 -it,则会看到命令后面的输出。

  • Docker Desktop 中,还可以查看正在运行的容器的日志。

Azure 中部署容器时,还可以访问容器日志。 下面是几个 Azure 服务以及如何在 Azure 门户中访问容器日志。

Azure 服务 如何在 Azure 门户中访问日志
用于容器的 Web 应用 转到 “诊断”并解决问题 资源以查看日志。 诊断 是一种智能交互式体验,可帮助你对应用进行故障排除,无需配置。 如需实时查看日志,请转到 监控 - 日志流。 有关更详细的日志查询和配置,请参阅 “监视”下的其他资源。
Azure 容器应用 (Azure Container Apps) 转到环境资源 诊断并解决问题 以排查环境问题。 通常,你会希望查看容器日志。 在容器资源中的 应用程序 - 修订管理下,选择修订,并从中可以查看系统和控制台日志。 有关更详细的日志查询和配置,请参阅 “监视”下的资源。
Azure 容器实例 转到 “容器 ”资源,然后选择“ 日志”。

对于这些服务,下面是用于访问日志的 Azure CLI 命令。

Azure 服务 用于访问日志的 Azure CLI 命令
用于容器的 Web 应用 az webapp log
Azure 容器应用 (Azure Container Apps) az containerapps logs
Azure 容器实例 az container logs

还支持在 VS Code 中查看日志。 必须安装 用于 VS Code 的 Azure 工具 。 下面是在 VS Code 中查看用于容器的 Web 应用(应用服务)日志的示例。

显示如何在用于容器的 Web 应用的 VS Code 中查看日志的屏幕截图。

后续步骤