通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用容器和Azure 函数

本文演示了Azure Functions为在Azure Container Apps环境中运行的容器化函数应用提供支持。 有关详细信息,请参阅Azure Functions 在 Azure Container Apps 上的托管

Important

现已推出用于直接在Azure Container Apps中运行Azure Functions的新托管方法。 请参阅 Azure 容器应用中的本机 Azure 函数支持。 通过此集成,可以使用Azure Container Apps的完整特性和功能。 还可以受益于函数编程模型和Azure Functions提供的自动缩放的简单性。

建议对大多数新工作负荷使用此方法。 有关详细信息,请参阅 Azure Functions on Azure Container Apps

本文演示了Azure Functions为在 Linux 容器中运行的函数应用提供支持。

选择本文顶部容器化函数应用的托管环境。

若要直接访问,以下文章介绍如何在 Linux 容器中创建第一个函数,并将映像从容器注册表部署到受支持的Azure托管服务:

Important

本文此刻演示如何使用连接字符串连接到默认存储帐户。 为确保最佳安全性,请改为使用 Microsoft Entra 身份验证,创建与 Azure Storage 的托管标识连接。 有关详细信息,请参阅连接

创建容器化函数应用

借助 Functions,可以轻松地将创建和维护的函数应用作为 Linux 容器进行部署和运行。 Functions 维护了一组特定于语言的基础映像,可以在生成容器化函数应用时使用。

Important

创建自己的容器时,需要将容器的基本映像更新到最新的受支持基础映像。 Azure Functions 支持的基础映像是针对特定编程语言的。 请参阅 Azure Functions 基本映像库

Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 你应该定期从最新的基础映像更新容器,并重新部署更新后的容器版本。 有关详细信息,请参阅 维护自定义容器

有关如何从命令行创建本地容器化函数应用并将映像发布到容器注册表的完整示例,请参阅 在本地 Linux 容器中创建函数应用

生成 Dockerfile

Functions 工具提供了一个 Docker 选项,该选项用于生成包含您的函数代码项目的 Dockerfile。 可以将此文件与 Docker 配合使用,在派生自正确基础映像(包括语言和版本)的容器中创建函数。

创建 Dockerfile 的方式取决于您如何创建项目。

  • 使用 Azure Functions Core Tools 创建 Functions 项目时,请在运行 --docker 命令时,添加 func init 选项,如以下示例所示:

    func init --docker
    
  • 在现有project文件夹中运行 --docker-only 命令时,还可以使用 func init 选项将 Dockerfile 添加到现有project,如以下示例所示:

    func init --docker-only
    

有关完整示例,请参阅在本地 Linux 容器中创建函数应用

创建自定义 Dockerfile

与其使用生成的 Dockerfile,不如在需要更好地控制容器镜像时手动创建一个 Dockerfile。 存储库的azure-functions-docker文件夹提供了以下模板来帮助你入门:

模板 Description
模板。Dockerfile 用于生成自定义容器的注释分步指南。 其中包括多种语言运行时(Java、.NET 隔离、Node.js、PowerShell、Python)、可选 CA 证书安装、以非根用户身份运行以及启用 SSH 进行 Kudu 调试的说明。
sample.Dockerfile 一个现成的示例,它基于模板生成了一个基于 Java 的 Azure Functions 容器,启用了 SSH 进行 Kudu 调试。

在容器中创建函数应用

如果您在代码项目中使用 Functions 生成的 Dockerfile,可以使用 Docker 在本地计算机上创建容器化函数应用。 以下 docker build 命令从本地目录中的项目创建容器化函数的映像:

docker build --tag <DOCKER_ID>/<IMAGE_NAME>:v1.0.0 .

有关如何创建容器的示例,请参阅生成容器映像并在本地验证

更新注册表中的映像

对函数代码进行更改project或需要更新到最新的基础映像时,请在本地重新生成容器。 将更新后的映像重新发布到所选容器注册表。 以下命令将使用更新的版本号从根文件夹重新生成映像,并将其推送到注册表:

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

<REGISTRY_NAME> 替换为您的容器注册表实例,将 <LOGIN_SERVER> 替换为登录服务器名称。

更新现有部署以使用新映像。 可以使用 Azure CLI 或在 Azure portal0 中更新函数应用以使用新映像:

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

在此示例中,<IMAGE_NAME> 是新映像的完整名称(包括版本)。 专用注册表要求提供用户名和密码。 请妥善存储这些凭据。

还应考虑实现持续部署

使用Azure portal创建容器化函数应用

Azure portal 中创建函数应用时,可以选择从容器注册表中的映像部署函数应用。 若要了解如何在容器注册表中创建容器化函数应用,请参阅在容器中创建函数应用

以下步骤用于从容器注册表创建和部署现有的容器化函数应用。

  1. 在Azure portal菜单或 Home 页中,选择创建资源

  2. “新建 ”页中,选择 “Web>函数应用”。

  3. “选择一个托管选项”下,选择 “Functions 高级”>选择

    此操作创建由 Azure Functions 托管在Premium 计划中的函数应用,该计划支持动态缩放。 还可以选择在 App Service 计划中运行,但在此类专用计划中,必须管理函数应用的 缩放

  4. 基本信息页面上,根据下表中的说明使用函数应用程序设置:

    Setting 建议值 Description
    Subscription 你的订阅 你将在该订阅中创建函数应用。
    资源组 myResourceGroup 将在其中创建函数应用的新资源组的名称。 你需要创建资源组,因为在现有资源组中创建新函数应用时存在已知限制
    函数应用名称 应用名称 用于标识新 Function App 的名称。 有效字符为 a-z(不区分大小写)、0-9-
    保护唯一默认主机名 Enabled 启用此功能,这样您就无需担心域名冲突,无论您的应用名称是什么。
    是否要部署代码或容器映像? 容器映像 从注册表部署容器化函数应用。 若要在注册表中创建函数应用,请参阅 在本地 Linux 容器中创建函数应用
    Region 首选区域 选择一个区域,该区域靠近你或靠近函数可以access的其他服务。
    Linux 计划 新计划(默认值) 创建新的高级计划来托管应用。 还可以选择现有的高级计划。
    定价计划 弹性高级 EP1 EP1 是最实惠的计划。 如果需要,可以选择更大的计划。
    区域冗余 Disabled 非生产应用中不需要此功能。
  5. 接受在 Storage 选项卡上创建新的 storage 帐户的默认选项,并在 Monitoring 选项卡上创建新的 Application Insight 实例。还可以选择使用现有的storage帐户或 Application Insights 实例。

  6. 选择 Review + create 以查看应用程序配置选项。

  7. 在“查看 + 创建”页上查看设置,然后选择“创建”以使用默认基础映像预配函数应用

  8. 创建函数应用资源后,选择“ 转到资源”。 在函数应用页中,选择 “部署中心”。

  9. 部署中心,可以将容器注册表作为映像的源进行连接。 还可以启用GitHub Actions或Azure Pipelines,以便更可靠的持续部署注册表中容器的更新。

使用Azure portal创建容器化函数应用

Azure portal 中创建容器应用托管的函数应用时,可以选择从容器注册表中的映像部署函数应用。 若要了解如何在容器注册表中创建容器化函数应用,请参阅在容器中创建函数应用

以下步骤用于从容器注册表创建和部署现有的容器化函数应用。

  1. 在Azure portal菜单或 Home 页中,选择创建资源

  2. “新建 ”页中,选择 “Web>函数应用”。

  3. 在“选择托管选项”下,选择“容器应用环境”>“选择”

  4. 基本信息页面上,根据下表中的说明使用函数应用程序设置:

    Setting 建议值 Description
    Subscription 你的订阅 你将在该订阅中创建函数应用。
    资源组 myResourceGroup 将在其中创建函数应用的新资源组的名称。 你需要创建资源组,因为在现有资源组中创建新函数应用时存在已知限制
    函数应用名称 唯一名称* 用于标识新 Function App 的名称。 有效字符为 a-z(不区分大小写)、0-9-
    Region 首选区域 选择一个区域,该区域靠近你或靠近函数可以access的其他服务。

    *应用名称在Azure Container Apps环境中必须唯一。

  5. 仍在 Basics 页上,接受建议的新建的 Azure Container Apps 环境。 为了最大程度降低成本,新的默认环境是在“消耗 + 专用”计划中创建的,采用默认工作负载配置文件且没有配置区域冗余。 有关详细信息,请参阅Azure Functions 在 Azure Container Apps 上的托管

    还可以选择使用现有的容器应用环境。 若要创建自定义环境,请选择“ 新建”。 在“创建容器应用环境”页中,可以添加非默认工作负荷配置文件或启用区域冗余。 若要了解环境,请参阅 Azure Container Apps 环境

  6. 选择容器选项卡,然后取消选择使用快速入门镜像。 否则,将从函数应用语言的基本映像部署函数应用。

  7. 选择 映像类型(公共或专用)。 如果使用Azure Container Registry或其他一些专用注册表,请选择 Private。 提供 映像 名称,包括注册表前缀。 如果使用专用注册表,请提供映像注册表的身份验证凭据。 Public 设置仅支持存储在Docker Hub中的图像。

  8. 在“容器资源分配”下,选择所需的 CPU 核心数和可用内存。 如果环境添加了其他工作负荷配置文件,则可以选择非默认 工作负荷配置文件。 此页上的选择会影响托管应用的成本。 请参阅 Container Apps 定价页估算潜在成本。

  9. 选择 Review + create 以查看应用程序配置选项。

  10. 在“查看 + 创建”页面上,查看各个设置,然后选择“创建”以预配函数应用并从注册表部署容器映像。

在 Azure Functions 中使用图像

从注册表部署函数应用容器时,Functions 会维护有关源映像的信息。

使用以下命令获取有关映像的数据,或更改使用的部署映像:

使用容器应用工作负载配置文件

工作负载配置文件是容器应用的一项功能,可让你更好地控制部署资源。 Azure Functions 在 Azure 容器应用中也支持工作负载配置文件。 有关详细信息,请参阅 Azure Container Apps 中的 工作负载配置文件。

还可以设置分配给应用的 CPU 和内存资源量。

可以使用Azure CLI或在Azure portal中创建和管理工作负荷配置文件和资源分配。

创建容器应用环境时,启用工作负载配置文件。 有关示例,请参阅在配置文件中创建容器应用

可以在环境中添加、编辑和删除配置文件。 有关示例,请参阅 “添加配置文件”。

在启用了工作负载配置文件的环境中创建容器化函数应用时,还应指定要在其中运行的配置文件。 使用 --workload-profile-name 命令的 az functionapp create 参数指定配置文件,如以下示例所示:

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime <LANGUAGE_STACK> --image <IMAGE_URI> --workload-profile-name <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

az functionapp create 命令中,--environment 参数指定容器应用环境,--image 参数指定要用于函数应用的映像。 在此示例中,将<STORAGE_NAME>替换为在上一节中使用的存储帐户名称。 此外,请将 <APP_NAME> 替换为适合你且在环境中唯一的名称。

若要设置分配给应用的资源,请将 <CPU_COUNT> 替换为所需的虚拟 CPU 数,至少为 0.5,最高为配置文件允许的最大值。 对于 <MEMORY_SIZE>,请选择专用内存量,最小为 1 GB,最大为配置文件允许的最大值。

可以使用 az functionapp 容器集命令来管理应用的已分配资源和工作负荷配置文件。

az functionapp container set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --workload-profile-name  <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

使用应用程序设置

使用 Azure Functions 可以以标准方式管理容器化函数应用的应用程序设置。 有关详细信息,请参阅 使用应用程序设置

Tip

默认情况下,容器化函数应用会监视端口 80 以接收传入请求。 如果应用必须使用其他端口,请使用 WEBSITES_PORT 应用程序设置 更改此端口。

启用持续部署到Azure

在 Azure Container Apps 上托管容器化函数应用时,可通过两种方法从源代码存储库设置持续部署:

目前无法根据容器注册表中的映像更改来持续部署容器。 必须改用这些基于源代码的持续部署流水线。

启用持续部署到Azure

Important

Elastic Premium 计划中运行容器时,目前不支持基于 Webhook 的部署。 如果需要使用本节中所述的持续部署方法,请改为在 App Service 计划中部署容器。 在 Elastic Premium 计划中运行时,每当对存储库中的容器进行更新时,都需要手动重启应用。

还可以使用 Azure PipelinesGitHub Actions 从源代码存储库配置持续部署。

每当更新注册表中的映像时,都可以启用Azure Functions来自动更新映像的部署。

  1. 使用以下命令启用持续部署并获取 Webhook URL:
az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg

az functionapp 部署容器配置命令启用持续部署并返回部署 Webhook URL。 可以使用 az functionapp 部署容器 show-cd-url 命令随时检索此 URL。

如前所述,将 <APP_NAME> 替换为函数应用名称。

  1. 将部署 Webhook URL 复制到剪贴板。

  2. 打开 Docker Hub,登录并选择导航栏上的 repositories。 找到并选择映像,选择“Webhook”选项卡,指定一个 Webhook 名称,将 URL 粘贴到“Webhook URL”中,然后选择“创建”。

    截图显示如何在 Docker Hub 窗口中添加 webhook。

  3. 设置 Webhook 后,每当在 Docker Hub 中更新其映像时,Azure Functions 会重新部署该映像。

启用 SSH 连接

SSH 实现容器和客户端之间的安全通信。 启用 SSH 后,可以使用 App Service 高级工具(Kudu)连接到容器。 若要使用 SSH 轻松连接到容器,Azure Functions提供了已启用 SSH 的基本映像。 只需编辑你的 Dockerfile,然后重新生成并重新部署映像即可。 然后,可以通过高级工具 (Kudu) 连接到容器。

  1. 在您的Dockerfile中,将字符串-appservice追加到基础映像的FROM指令中,如以下示例:

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    此示例使用支持 SSH 的 Node.js 版本 18 基础映像。 访问 Azure Functions 基本映像存储库,验证你使用的是启用 SSH 的基础映像的最新版本。

  2. 使用 docker build 命令重新生成映像,将 <DOCKER_ID> 替换为Docker Hub帐户 ID,如以下示例所示。

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. 将更新后的映像推送到Docker Hub,这应该比第一次推送要少得多的时间。 现在只需上传更新的映像段。

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. Azure Functions会自动将映像重新部署到函数应用。 该过程在不到一分钟内进行。

  5. Azure portal 中,找到函数应用。 在左侧菜单中,选择 “开发工具>SSH”。 选择 “Go”。 如果Azure仍在更新容器映像,则连接可能需要一些时间。

  6. 与容器建立连接后,运行 top 命令查看当前正在运行的进程。

    显示在 SSH 会话中运行的 Linux top 命令的屏幕截图。

以下文章提供了有关部署和管理容器的详细信息: