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

使用自定义容器映像部署应用程序

注意

本文引用了 CentOS,这是一个处于生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文适用于:✔️ 标准计划 ✔️ 企业计划

本文介绍如何使用自定义容器映像在 Azure Spring Apps 中部署 Spring Boot 应用程序。 使用自定义容器部署应用程序时支持的功能与在部署 JAR 应用程序时支持的大多数功能一样。 还可以使用容器映像部署其他 Java 和非 Java 应用程序。

先决条件

  • 包含应用程序的容器映像。
  • 该映像将推送到映像注册表。 有关详细信息,请参阅 Azure 容器注册表

注意

Web 应用程序必须侦听标准计划的端口 1025 和企业计划的端口 8080。 更改端口的方式取决于应用程序的框架。 例如,可以为 Spring Boot 应用程序指定 SERVER_PORT=1025,也可为 ASP.NET Core 应用程序指定 ASPNETCORE_URLS=http://+:1025/。 对于未在任何端口上进行侦听的应用程序,可以禁用探测。 有关详细信息,请参阅如何为 Azure Spring Apps 中托管的应用配置运行状况探测和正常终止期

部署应用程序

若要将应用程序部署到自定义容器映像,请执行以下步骤:

若要部署容器映像,请使用以下命令之一:

  • 若要将容器映像部署到公共 Docker Hub,从而部署到应用,请使用以下命令:

    az spring app deploy \
       --resource-group <your-resource-group> \
       --name <your-app-name> \
       --container-image <your-container-image> \
       --service <your-service-name>
    
  • 若要将容器映像从 ACR 部署到应用,或者从另一个专用注册表部署到应用,请使用以下命令:

    az spring app deploy \
       --resource-group <your-resource-group> \
       --name <your-app-name> \
       --container-image <your-container-image> \
       --service <your-service-name>
       --container-registry <your-container-registry> \
       --registry-password <your-password> |
       --registry-username <your-username>
    

若要覆盖映像的入口点,请将以下两个参数添加到上述任何命令:

    --container-command "java" \
    --container-args "-jar /app.jar -Dkey=value"

若要禁止在端口上侦听并非 Web 应用程序的映像,请将以下参数添加到上述命令:

    --disable-probe true

功能支持矩阵

以下矩阵显示了每种应用程序类型支持的功能。

Feature Spring Boot 应用 - 容器部署 Polyglot 应用 - 容器部署 注释
应用生命周期管理 ✔️ ✔️
对容器注册表的支持 ✔️ ✔️
分配终结点 ✔️ ✔️
Azure Monitor ✔️ ✔️
APM 集成 ✔️ ✔️ 支持手动安装
蓝/绿部署 ✔️ ✔️
自定义域 ✔️ ✔️
缩放 - 自动缩放 ✔️ ✔️
缩放 - 手动缩放(横向缩减/扩展、纵向扩展/缩减) ✔️ ✔️
托管的标识 ✔️ ✔️
Spring Cloud Eureka 和 Config Server ✔️
VMware Tanzu 的 API 门户 ✔️ ✔️ 仅限企业计划。
VMware Tanzu 的 Spring Cloud 网关 ✔️ ✔️ 仅限企业计划。
VMware Tanzu 的应用程序配置服务 ✔️ 仅限企业计划。
适用于 VMware Tanzu 的应用程序实时视图 ✔️ 仅限企业计划。
VMware Tanzu 服务注册表 ✔️ 仅限企业计划。
VNET ✔️ ✔️ 将注册表添加到 NSG 或 Azure 防火墙中的允许列表
传出 IP 地址 ✔️ ✔️
E2E TLS ✔️ ✔️ 信任自签名 CA
实时性和就绪性设置 ✔️ ✔️
高级故障排除 - 线程/堆/JFR 转储 ✔️ 映像必须包含 Bash 和指定了 PATH 的 JDK。
自带存储空间 ✔️ ✔️
将服务绑定与资源连接器集成 ✔️
可用性区域 ✔️ ✔️
应用程序生命周期事件 ✔️ ✔️
减小应用大小 - 0.5 vCPU 和 512 MB ✔️ ✔️
使用 Terraform 自动进行应用部署 ✔️ ✔️
软删除 ✔️ ✔️
交互式诊断体验(基于 AppLens) ✔️ ✔️
SLA ✔️ ✔️

注意

Polyglot 应用包括非 Spring Boot Java、NodeJS、AngularJS、Python 和 .NET 应用。

使用自定义容器进行部署时要注意的常见要点

以下几点将帮助你解决使用自定义映像进行部署时的常见情况。

信任证书颁发机构

有两个选项可用于信任证书颁发机构:

选项 1:通过 Azure Spring Apps 上传

若要将 CA 证书加载到应用中,请参阅在 Azure Spring Apps 的应用程序中使用 TLS/SSL 证书。 然后,证书将装载到位置 /etc/azure-spring-cloud/certs/public/。

选项 2:在映像中手动安装

若要信任映像中的 CA,请根据环境设置以下变量:

  • 必须通过将以下行添加到 Dockerfile 中,将 Java 应用程序导入到信任存储:

    ADD EnterpriseRootCA.crt /opt/
    RUN keytool -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias EnterpriseRootCA -file /opt/EnterpriseRootCA.crt
    
  • 对于 Node.js 应用程序,请设置 NODE_EXTRA_CA_CERTS 环境变量:

    ADD EnterpriseRootCA.crt /opt/
    ENV NODE_EXTRA_CA_CERTS="/opt/EnterpriseRootCA.crt"
    
  • 对于 Python 或其他依赖于系统 CA 存储的语言,请在 Debian 或 Ubuntu 映像上添加以下环境变量:

    ADD EnterpriseRootCA.crt /usr/local/share/ca-certificates/
    RUN /usr/sbin/update-ca-certificates
    
  • 对于 Python 或其他依赖于系统 CA 存储的语言,请在基于 CentOS 或 Fedora 的映像上添加以下环境变量:

    ADD EnterpriseRootCA.crt /etc/pki/ca-trust/source/anchors/
    RUN /usr/bin/update-ca-trust
    

在映像更改时避免意外行为

重启或横向扩展应用程序时,将始终拉取最新的映像。 如果映像已更改,新启动的应用程序实例将使用新映像,而旧实例将继续使用旧映像。

注意

避免使用 latest 标记,或者覆盖映像而不更改标记,以避免意外的应用程序行为。

避免无法连接到 VNet 中的容器注册表

如果已将实例部署到 VNet,请确保允许网络流量流向 NSG 或 Azure 防火墙(如果已使用)中的容器注册表。 有关详细信息,请参阅客户对 VNet 中的运行承担的责任以添加所需的安全规则。

手动将 APM 安装到映像中

安装步骤因应用程序性能监视器 (APM) 和语言的不同而异。 以下步骤适用于使用了 Java 的 New Relic 应用程序。 必须使用以下步骤修改 Dockerfile:

  1. 通过将以下内容添加到 Dockerfile,将代理文件下载并安装到映像中:

    ADD newrelic-agent.jar /opt/agents/newrelic/java/newrelic-agent.jar
    
  2. 添加 APM 所需的环境变量:

    ENV NEW_RELIC_APP_NAME=appName
    ENV NEW_RELIC_LICENSE_KEY=newRelicLicenseKey
    
  3. 通过添加以下内容修改映像入口点:java -javaagent:/opt/agents/newrelic/java/newrelic-agent.jar

若要安装适用于其他语言的代理,请参阅其他代理的官方文档:

New Relic:

Dynatrace:

AppDynamics:

查看容器日志

若要查看容器应用程序的控制台日志,可以使用以下 CLI 命令:

az spring app logs \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --service <your-service-name> \
    --instance <your-instance-name>

若要查看 Azure Monitor 中的容器事件日志,请输入查询:

AppPlatformContainerEventLogs
| where App == "hw-20220317-1b"

显示容器事件日志的 Azure Monitor 的屏幕截图。

扫描映像中的漏洞

建议将 Microsoft Defender for Cloud 与 ACR 配合使用,以防止映像易受攻击。 有关详细信息,请参阅 Microsoft Defender for Cloud

在 JAR 部署和容器部署之间切换

可以通过使用以下命令进行重新部署,直接将部署类型从 JAR 部署切换为容器部署:

az spring app deploy \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --container-image <your-container-image> \
    --service <your-service-name>

或者反过来:

az spring app deploy \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --artifact-path <your-jar-file> \
    --service <your-service-name>

使用现有 JAR 部署创建另一个部署

可以使用以下命令利用现有 JAR 部署创建另一个部署:

az spring app deployment create \
    --resource-group <your-resource-group> \
    --name <your-deployment-name> \
    --app <your-app-name> \
    --container-image <your-container-image> \
    --service <your-service-name>

CI/CD

现在支持使用 Azure Pipelines 任务或 GitHub Actions 进行自动部署。 有关详细信息,请参阅自动将应用程序部署到 Azure Spring Apps将 Azure Spring Apps CI/CD 与 GitHub Actions 配合使用

后续步骤