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

使用容器和 Azure Functions

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

本文演示 Azure Functions 如何支持用户使用 Linux 容器中运行的函数应用。

在本文的顶部为你的容器化函数应用选择宿主环境。

如果你想要直奔主题,请参阅以下文章,其中介绍了如何创建在 Linux 容器中运行的第一个函数,并将容器注册表中的映像部署到支持的 Azure 宿主服务:

创建容器化函数应用

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

重要

创建自己的容器时,需要将容器的基础映像更新为受支持的最新基础映像。 Azure Functions 支持的基映像特定于语言,可在 Azure Functions 基础映像存储库中找到。

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

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

生成 Dockerfile

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

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

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

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

    func init --docker-only
    

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

在容器中创建函数应用

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

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

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

更新注册表中的映像

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

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

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

此时,需要更新现有部署以使用新映像。 可以通过 Azure CLI 或 Azure 门户将函数应用更新为使用新映像:

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 门户中使用容器进行创建

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

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

  1. 在 Azure 门户菜单上或在门户主页中,选择“创建资源”。

  2. “新建” 页面,选择 “计算”>“函数应用”

  3. 在“选择托管”选项下,选择“高级计划”>“选择”

    这会在高级计划中创建由 Azure Functions 托管的函数应用,该计划支持动态扩缩。 你还可以选择在应用服务计划中运行,但在此类专用计划中,你必须管理函数应用的扩缩

  4. 在“基本信息”页面上,按照下列所述使用函数应用设置:

    设置 建议值 描述
    订阅 你的订阅 你将在该订阅中创建函数应用。
    资源组 myResourceGroup 将在其中创建函数应用的新资源组的名称。 你需要创建资源组,因为在现有资源组中创建新函数应用时存在已知限制
    函数应用名称 唯一名称* 用于标识新 Function App 的名称。 有效字符为 a-z(不区分大小写)、0-9-
    是否要部署代码或容器映像? 容器映像 从注册表部署容器化函数应用。 若要在注册表中创建函数应用,请参阅在本地容器中创建函数应用
    区域 首选区域 选择与你靠近或者与函数可以访问的其他服务靠近的区域
    Linux 计划 新计划(默认值) 创建新的高级计划来托管应用。 还可以选择现有的高级计划。
    定价计划 弹性高级 EP1 EP1 是最实惠的计划。 如果需要,可以选择更大的计划。
    区域冗余 已禁用 非生产应用中不需要此功能。

    *应用名称在所有 Azure Functions 托管应用中必须全局唯一。

  5. 接受默认选项,即在“存储”选项卡上创建新存储帐户,在“监视”选项卡上创建新的 Application Insights 实例。还可以选择使用现有的存储帐户或 Application Insights 实例。

  6. 选择“查看 + 创建”,以便查看应用配置选择。

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

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

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

在 Azure 门户中使用容器进行创建

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

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

  1. 在 Azure 门户菜单上或在门户主页中,选择“创建资源”。

  2. “新建” 页面,选择 “计算”>“函数应用”

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

  4. 在“基本信息”页面上,按照下列所述使用函数应用设置:

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

    *应用名称在 Azure 容器应用环境中必须是唯一的。

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

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

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

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

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

  9. 选择“查看 + 创建”,以便查看应用配置选择。

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

在 Azure Functions 中使用映像

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

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

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

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

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

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

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

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

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

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 container set 命令来管理应用的已分配资源和工作负荷配置文件。

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

应用程序设置

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

启用到 Azure 的持续部署

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

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

启用到 Azure 的持续部署

重要

Elastic Premium 计划中运行容器时,目前不支持基于 Webhook 的部署。 如果需要使用本节中所述的持续部署方法,请改为在 应用服务计划中部署容器。 在 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 deployment container config 命令可启用持续部署并返回部署 Webhook URL。 以后随时可以使用 az functionapp deployment container show-cd-url 命令检索此 URL。

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

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

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

    屏幕截图显示如何在 Docker Hub 窗口中添加 Webhook。

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

启用 SSH 连接

SSH 实现容器和客户端之间的安全通信。 启用 SSH 后,可以使用应用服务高级工具 (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 会自动将映像重新部署到 Functions 应用;此过程在一分钟内即可完成。

  5. 在浏览器中打开 https://<app_name>.scm.azurewebsites.net/,并将 <app_name> 替换为你的唯一名称。 此 URL 是函数应用容器的高级工具 (Kudu) 终结点。

  6. 登录到你的 Azure 帐户,然后选择“SSH”以便与容器建立连接。 如果 Azure 仍在更新容器映像,则连接可能需要一段时间。

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

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

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