用ACA(Azure Container Apps)在Spring Boot WEB服务上启动(ACR自定义容器映像)

使用 ACA(Azure 容器应用程序)在 Spring Boot WEB 服务中运行(使用 ACR 自定义容器镜像)

The purpose

在Azure Container Apps环境中启动Spring Boot Web服务,并加深对其理解。

实现

将Spring Boot WEB应用的自定义容器镜像部署到Microsoft Azure容器应用程序(ACA)。

技术背景

Azure容器应用程序(ACA)是什么?

这是一个在Azure上运行的容器应用程序平台。ACA支持Docker容器和Kubernetes集群环境,开发人员可以创建Docker容器镜像并将其部署为Kubernetes资源。此外,ACA支持自定义域名,可以保持自己的品牌。ACA的主要优点包括:

简便的设置和部署:ACA提供了简单的用户界面,只需几次点击即可设置和部署容器应用程序。

可扩展性:ACA能够自动进行扩展。如果应用程序所需的资源增加,ACA会自动添加所需的资源并分散处理。

安全性:ACA提供了运行容器应用程序所需的安全功能,例如与Azure Active Directory的集成和容器级别的访问控制。

成本效益:ACA在需要时按需添加所需的资源,可以将不必要的资源使用最小化。此外,只对所需资源进行付费,可以高效利用成本。

开发环境

    • 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 Runtime Environment(构建11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64位服务器 VM(构建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构建应用程序(※参考)

※ 创建 target/app.jar 文件。
※ 另外,通过创建下方容器镜像的操作也会同时创建 target/app.jar 文件,因此不是必需的。

$ mvn clean install

创建容器镜像 (Chuangjian rongqi jingxiang)

建立容器映像

※ 在本地的 Docker 环境(Docker Desktop)中创建了 app-hello-spring-boot 容器映像。
※ 这是根据 spring-boot:build-image 规范,容器映像的创建时间将设定为Unix纪元。

$ mvn spring-boot:build-image \
    -Dspring-boot.build-image.imageName=app-hello-spring-boot

查看容器映像

$ 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

查看容器注册表中的镜像。

de .)

$ az acr repository list --name cr20230212 --output table
Result
---------------------
app-hello-spring-boot

我可以将本地的容器映像推送到Azure容器注册表中。

容器化应用环境

安装扩展功能※仅限初次安装。

显示步骤。扩展功能
安装
$ az扩展添加–name containerapp –upgrade

注册Microsoft.App命名空间
$ az提供者注册–namespace Microsoft.App

注册Microsoft.OperationalInsights提供者
$ az提供者注册–namespace Microsoft.OperationalInsights

创建容器应用环境
※ 由于认为是基于Kubernetes平台的环境,可能需要一些时间。

$ az containerapp env create \
    --resource-group rg-hello \
    --name cae-hello \
    --location japaneast

显示容器应用环境清单

$ az containerapp env list

如果要删除容器应用环境,请执行以下操作。

$ az containerapp env delete -n <env-name> -g <group>

容器应用程序

创建和部署容器应用

$ az containerapp create \
    --resource-group rg-hello \
    --environment cae-hello \
    --name ca-hello-spring-boot \
    --image cr20230212.azurecr.io/app-hello-spring-boot:latest \
    --target-port 8080 \
    --ingress 'external' \
    --registry-server cr20230212.azurecr.io \
    --registry-username cr20230212 \
    --registry-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --min-replicas 1

容器应用程序已创建。

Container app created. Access your app at https://ca-hello-spring-boot.prouddune-ed6b9700.japaneast.azurecontainerapps.io/

如果要删除容器应用程序,只需要:※删除容器应用程序

$ az containerapp delete -n <name> -g <group>

请在网络浏览器中确认
※ 请根据环境更改URL。

https://ca-hello-spring-boot.prouddune-ed6b9700.japaneast.azurecontainerapps.io/api/data

在WEB浏览器上显示了{“message”:”你好世界!”},成功获取了JSON数据。

请使用curl命令从另一个终端确认。

$ curl -v https://ca-hello-spring-boot.prouddune-ed6b9700.japaneast.azurecontainerapps.io/api/data
*   Trying 20.210.29.255:443...
* Connected to ca-hello-spring-boot.agreeablepond-79ba8527.japaneast.azurecontainerapps.io (20.210.29.255) 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 header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* 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-CHACHA20-POLY1305
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=US; ST=WA; L=Redmond; O=Microsoft Corporation; CN=agreeablepond-79ba8527.japaneast.azurecontainerapps.io
*  start date: Feb 25 03:06:09 2023 GMT
*  expire date: Feb 20 03:06:09 2024 GMT
*  subjectAltName: host "ca-hello-spring-boot.agreeablepond-79ba8527.japaneast.azurecontainerapps.io" matched cert's "*.agreeablepond-79ba8527.japaneast.azurecontainerapps.io"
*  issuer: C=US; O=Microsoft Corporation; CN=Microsoft Azure TLS Issuing CA 01
*  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 0x55c86464be80)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET /api/data HTTP/2
> Host: ca-hello-spring-boot.agreeablepond-79ba8527.japaneast.azurecontainerapps.io
> 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):
< HTTP/2 200
< content-type: application/json
< date: Mon, 27 Feb 2023 07:31:07 GMT
<
* Connection #0 to host ca-hello-spring-boot.agreeablepond-79ba8527.japaneast.azurecontainerapps.io left intact
{"message":"Hello World!"}

在终端中显示{“message”:”你好世界!”},并成功获取了JSON数据。

※ Azure 会在其侧面提供使用 SSL/TLS 和 HTTP/2 协议。

连接到容器应用程序

$ az containerapp exec \
    --resource-group rg-hello \
    --name ca-hello-spring-boot 
INFO: Connecting to the container 'ca-hello-spring-boot'...
Use ctrl + D to exit.
INFO: Successfully connected to container: 'ca-hello-spring-boot'. 

连接到容器之后

$ pwd
/workspace
$ ls -la
total 20
drwxr-xr-x 1 cnb  cnb  4096 Jan  1  1980 .
drwxr-xr-x 1 root root 4096 Feb 27 07:30 ..
drwxr-xr-x 1 cnb  cnb  4096 Jan  1  1980 BOOT-INF
drwxr-xr-x 3 cnb  cnb  4096 Jan  1  1980 META-INF
drwxr-xr-x 3 cnb  cnb  4096 Jan  1  1980 org

容器的信息

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
NAME="Ubuntu"
ID=ubuntu
PRETTY_NAME="Paketo Buildpacks Base Bionic"
VERSION_ID="18.04"
HOME_URL="https://github.com/paketo-buildpacks/bionic-base-stack"
UBUNTU_CODENAME=bionic
VERSION="18.04.6 LTS (Bionic Beaver)"
ID_LIKE=debian
SUPPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/blob/main/README.md"
BUG_REPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/issues/new"
VERSION_CODENAME=bionic

总结

    Ubuntu のシンプルな構成の Java 開発環境で Spring Boot WEBサービスのカスタムコンテナイメージを ACA (Azure Container Apps) 環境で起動させることが出来ました。

请参考

Azure容器应用程序命令参考文档

广告
将在 10 秒后关闭
bannerAds