使用 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应用服务是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(Microsoft Store 应用程序版)
> 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 命令参考资料

广告
将在 10 秒后关闭
bannerAds