使用 Azure App Service 在 Spring Boot WEB 服务上启动 (ACR 自定义容器映像)
使用 Azure App Service 在 Spring Boot WEB 服务中启动 (ACR 自定义容器映像)。
答案
在Azure App Service环境中启动Spring Boot WEB服务,以加深理解。
实现
我将使用Microsoft Azure App Service在Spring Boot WEB应用程序中部署自定义容器映像。
科技背景
微软Azure应用服务是什么?
Microsoft Azure应用服务是Microsoft Azure平台即服务(PaaS)的一种服务,专注于托管WEB应用程序、移动应用程序和API应用程序。
Azure App Service的主要特点和优点如下:
简单的部署
通过使用Azure Portal、Azure CLI、Azure DevOps等工具,可以轻松部署WEB应用程序。此外,它支持多种编程语言和框架,实现了灵活的开发。
可扩展性
Azure App Service支持自动和手动扩展,可以根据应用程序的负载灵活扩展。
高可用性
Azure App Service具有全球负载均衡和故障转移功能,可以实现高可用性。
集成
Azure App Service可以与其他Azure服务无缝集成。例如,与Azure SQL数据库和Azure存储等存储服务协作,便于应用程序的数据管理。
安全性
Azure App Service提供网络安全组(NSG)和WEB应用程序防火墙(WAF)等安全功能,可以提高应用程序的安全性。
总结
凭借这些特点和优势,Azure App Service被开发人员和企业用作支持快速而灵活的WEB应用程序开发和部署的平台。
开发环境
-
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
> wsl –version
WSL 版本:1.0.3.0
内核版本:5.15.79.1
WSLg 版本:1.0.47Ubuntu
$ lsb_release -a
没有可用的 LSB 模块。
发行商 ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
发布:22.04
Java JDK※ Java JDK 的安装和 Hello World!
$ java -version
openjdk version “11.0.17” 2022-10-18
OpenJDK 运行时环境(build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64 位服务器虚拟机(build 11.0.17+8-post-Ubuntu-1ubuntu222.04,混合模式,共享)
Maven※ Maven 的安装和 Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven 主页:/usr/share/maven
Java 版本:11.0.17,供应商:Ubuntu,运行时:/usr/lib/jvm/java-11-openjdk-amd64
Docker Desktop
版本 4.16.3(96739)
$ docker –version
Docker 版本 20.10.22,构建 3a2c30b
$ docker-compose –version
Docker Compose 版本 v2.15.1
※ 本文将基本上使用Ubuntu终端进行操作。
显示”Hello World”的步骤
创建Spring Boot Web服务
可以参考Spring Boot WEB服务的Hello World!
进入项目文件夹。
假设 `~/tmp/hello-spring-boot` 是项目文件夹。
$ cd ~/tmp/hello-spring-boot
建立Java应用程序(参考)。
※ 将会生成目标/app.jar。
※ 在创建下方的容器映像的操作中也会同时生成目标/app.jar,因此并非必需。
$ mvn clean install
创建容器映像
编辑 Dockerfile
※ 在验证阶段,仅使用原始的 spring-boot:build-image 无法正常工作,需要明确添加 EXPOSE 8080 的设置。
$ vim Dockerfile
文件的内容
EXPOSE 8080
构建容器映像
※ 将创建 app-hello-spring-boot 容器映像在本地的 Docker 环境(Docker Desktop)中。
※ 容器映像的创建时间遵循 spring-boot:build-image 的规范而成为 Unix 纪元。
$ mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=app-hello-spring-boot \
-Dspring-boot.build-image.dockerfile=Dockerfile
确认容器镜像
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest e37cc77f2b36 43 years ago 262MB
注册Azure账户
使用Azure免费帐户在云上进行构建
使用 Azure CLI 登录
请参考 Azure CLI 的安装步骤。
$ az login
※ 如果要更新到最新版本
$ az upgrade
华丽的蓝天环境
资源组
创建资源组
$ az group create \
--name rg-hello \
--location japaneast
展示资源组列表
$ az group list
如果要删除资源组
$ az group delete -n <group>
容器注册表
创建容器注册表
※ 无法使用 –sku Free 进行创建
※ –name 必须提供一个在公共领域中唯一的值。
$ az acr create \
--resource-group rg-hello \
--name cr20230212 \
--sku Basic
展示容器注册表列表
$ az acr list
显示容器注册表登录凭证信息
$ az acr update -n cr20230212 --admin-enabled true
$ az acr credential show \
--resource-group rg-hello \
--name cr20230212
{
"passwords": [
{
"name": "password",
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"name": "password2",
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
],
"username": "cr20230212"
}
如果要删除容器注册表。
$ az acr delete --n <acr-name>
登入容器注册表。
$ az acr login --name cr20230212
将容器镜像推送到容器注册表中。
$ docker tag app-hello-spring-boot cr20230212.azurecr.io/app-hello-spring-boot:latest
$ docker push cr20230212.azurecr.io/app-hello-spring-boot:latest
确认容器注册表中的镜像。
$ az acr repository list --name cr20230212 --output table
Result
---------------------
app-hello-spring-boot
我成功地将本地容器映像推送到 Azure 容器注册表。
应用服务计划
创建 App Service 计划
$ az appservice plan create \
--resource-group rg-hello \
--name asp-hello \
--sku Free \
--is-linux
显示App Service计划的列表。
$ az appservice plan list
※ 如果要删除App Service计划
$ az appservice plan delete -n <plan> -g <group>
应用服务WEB应用
在Azure App Service中部署Spring Boot WEB应用的容器映像有多种方式,但本次将介绍如何使用Azure CLI在ACR上部署容器映像的方法。
创建和部署 Web 应用程序
$ az webapp create \
--resource-group rg-hello \
--plan asp-hello \
--name app-hello-spring-boot \
--deployment-container-image-name cr20230212.azurecr.io/app-hello-spring-boot:latest \
--docker-registry-server-user cr20230212 \
--docker-registry-server-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
配置 Web 应用程序的设置
※ App Service WEB 应用程序默认监听端口 80。
$ az webapp config appsettings set \
--resource-group rg-hello \
--name app-hello-spring-boot \
--settings WEBSITES_PORT=8080
Web应用程序日志记录的配置
$ az webapp log config \
--resource-group rg-hello \
--name app-hello-spring-boot \
--docker-container-logging filesystem \
--application-logging filesystem \
--web-server-logging filesystem
通过网络浏览器访问
$ az webapp browse \
--resource-group rg-hello \
--name app-hello-spring-boot
尽管需要一些时间来启动,但页面将会显示出来。然而,显示的页面“/”并没有设置内容。
请使用网络浏览器再次确认
※ 请根据您的环境重新读取URL。
https://app-hello-spring-boot.azurewebsites.net/api/data
我可以在WEB浏览器上看到{“message”:”你好,世界!”},并成功获取了JSON数据。
请使用另一个终端使用curl命令进行确认。
$ curl -v https://app-hello-spring-boot.azurewebsites.net/api/data
* Trying 20.43.67.36:443...
* Connected to app-hello-spring-boot.azurewebsites.net (20.43.67.36) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: C=US; ST=WA; L=Redmond; O=Microsoft Corporation; CN=*.azurewebsites.net
* start date: Dec 27 21:12:39 2022 GMT
* expire date: Dec 22 21:12:39 2023 GMT
* subjectAltName: host "app-hello-spring-boot.azurewebsites.net" matched cert's "*.azurewebsites.net"
* issuer: C=US; O=Microsoft Corporation; CN=Microsoft Azure TLS Issuing CA 05
* SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* Using Stream ID: 1 (easy handle 0x55b794ea9e80)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET /api/data HTTP/2
> Host: app-hello-spring-boot.azurewebsites.net
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 200
< content-type: application/json
< date: Mon, 27 Feb 2023 02:51:05 GMT
< set-cookie: ARRAffinity=ae907ce840c6b95b786870ca4c1362dc92f4733f1b7145fe24a6c8a07a0d5ff4;Path=/;HttpOnly;Secure;Domain=app-hello-spring-boot.azurewebsites.net
< set-cookie: ARRAffinitySameSite=ae907ce840c6b95b786870ca4c1362dc92f4733f1b7145fe24a6c8a07a0d5ff4;Path=/;HttpOnly;SameSite=None;Secure;Domain=app-hello-spring-boot.azurewebsites.net
<
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Connection #0 to host app-hello-spring-boot.azurewebsites.net left intact
{"message":"Hello World!"}
在终端上显示{“message”:”Hello World!”}并成功获取JSON数据。
※ Azure会提供SSL / TLS支持和HTTP / 2协议的功能。
总结
- Ubuntu のシンプルな構成の Java 開発環境で Spring Boot WEBサービスを Azure App Service 環境で起動させることが出来ました。
请在中国本地化的情况下重新表达以下内容:
参考文献
Azure App Service 命令参考资料