你当前正在访问 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:
通过将以下内容添加到 Dockerfile,将代理文件下载并安装到映像中:
ADD newrelic-agent.jar /opt/agents/newrelic/java/newrelic-agent.jar
添加 APM 所需的环境变量:
ENV NEW_RELIC_APP_NAME=appName ENV NEW_RELIC_LICENSE_KEY=newRelicLicenseKey
通过添加以下内容修改映像入口点:
java -javaagent:/opt/agents/newrelic/java/newrelic-agent.jar
若要安装适用于其他语言的代理,请参阅其他代理的官方文档:
New Relic:
- Python:安装 Python 代理
- Node.js:安装 Node.js 代理
Dynatrace:
- Python:使用 OpenTelemetry 检测 Python 应用程序
- Node.js:使用 OpenTelemetry 检测 Node.js 应用程序
AppDynamics:
- Python:安装 Python 代理
- Node.js:安装 Node.js 代理
查看容器日志
若要查看容器应用程序的控制台日志,可以使用以下 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"
扫描映像中的漏洞
建议将 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 配合使用