在 Azure 容器应用程序(ACA)中部署 Spring Boot Web 服务(使用 Docker Hub 自定义容器镜像)

使用Azure容器应用程序(ACA)将Spring Boot Web服务部署到Docker Hub的自定义容器映像。

spring-boot_on_azure-container-apps.png

目标

使用 Windows 11 的 Linux 进行云端开发。

您可以从这里查看文章列表。

 

实现

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

以JAR文件格式作为容器来启动应用程序。

要素概要terminalターミナルAzureクラウド環境Azure Container Appsコンテナ実行環境app-hello-spring-bootカスタムコンテナJVMJava 実行環境app.jarJava アプリケーションtomcatWeb サーバー
本文使用了在Docker Hub上发布的可公开访问的自定义容器映像。在实际的系统开发中,获取容器映像的注册表可能会有所不同,请适时确认。

技术主题

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

Azure 上运行的容器应用平台。ACA 支持 Docker 容器和 Kubernetes 集群环境,开发人员可以创建容器镜像并将其部署为 Kubernetes 资源。此外,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模块。
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04

Java JDK *您可以从相关文章中查找安装方法。
$ java -version
openjdk version “11.0.18” 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

Maven *您可以从相关文章中查找安装方法。
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64

Docker *您可以从相关文章中查找安装方法。
$ docker –version
Docker版本23.0.1,构建a5ee5b1

在这篇文章中,我们主要介绍了在 Ubuntu 终端上操作的基本方法。对于初次学习如何使用 Vim 进行复制粘贴的人,我们在下面的文章中介绍了详细步骤。请务必尝试一下。

 

制作Web应用程序的规格

NoエンドポイントHTTPメソッドMIME タイプ1/api/dataGETapplication/json

顯示 “Hello World” 的步驟

创建Spring Boot Web服务

您可以在本文中确认操作步骤。

 

通过这些步骤,您可以在本地 Docker 环境中构建应用程序的自定义容器镜像。

进入项目文件夹

我們將進入項目文件夾。
※假設~/tmp/hello-spring-boot為項目文件夾。

$ cd ~/tmp/hello-spring-boot

确认容器镜像

启动Docker守护进程。

$ sudo service docker start
 * Starting Docker: docker      [ OK ]

查看容器镜像。

$ docker images | grep app-hello-spring-boot
app-hello-spring-boot   latest    39115028afa6   12 seconds ago   390MB

将容器镜像注册到 Docker Hub。

创建一个Docker Hub帐户。

您可以点击链接进行查看:
https://hub.docker.com/signupDocker Hub 是一个基于云的注册表,用于共享、存储和管理容器。在 Docker Hub 上存储着由社区创建的官方和社区图像。此外,用户还可以上传和共享自定义容器图像。

登录 Docker Hub。

$ docker login
Login Succeeded

给容器镜像打上标签。

在这里,$USER是Ubuntu的shell变量USER的嵌入变量。换句话说,如果在将定制的容器映像推送到Docker Hub时指定的帐户名与Ubuntu用户名相同,那么处理映像将变得简单。但是,请注意,这种方法仅限于验证目的。
$ docker tag app-hello-spring-boot:latest \
    $USER/app-hello-spring-boot:latest
打开说明。使用docker tag命令,可以为本地保存的容器镜像添加指定的标签来重命名容器镜像。
在这个示例中,为名为app-hello-spring-boot的容器镜像添加了标签user/app-hello-spring-boot:latest。这里的user表示Docker Hub上的用户名。标签可以在冒号 : 后面包含版本等信息,但在这里我们指定了latest,表示最新版本。

将容器镜像推送到Docker Hub。

$ docker push $USER/app-hello-spring-boot:latest
打开说明。docker push 命令用于将容器镜像推送到 Docker Hub 仓库。user/app-hello-spring-boot 指定了要推送的镜像的名称和标签,latest 指定了镜像的版本。
这样,将在 Docker Hub 上创建一个名为 user 的用户仓库,并在其中上传一个名为 app-hello-spring-boot 的容器镜像。

通过此步骤,您可以将名为$USER/app-hello-spring-boot:latest的自定义容器映像推送到Docker Hub。

创建shell变量

作为一个Shell变量,在Ubuntu上创建以下值。根据情况,可能需要更改容器应用的名称。
location_name=japaneast
resource_group_name=rg-hello
containerapp_env_name=cae-hello
containerapp_name=ca-hello-spring-boot
container_image_name=app-hello-spring-boot:latest

登录到Azure环境

这篇文章将从此相关文章的继续部分开始介绍步骤。

 

使用 Azure CLI 进行登录。

$ az login

蔚蓝环境

资源组

创建资源组。

$ az group create \
    --name $resource_group_name \
    --location $location_name
打开说明。此命令使用Azure CLI创建Azure资源组。

命令
内容

az group create
用于创建Azure资源组的命令。

选项

内容

–name
rg-hello
指定资源组的名称。

–location
japaneast
将资源组创建在japaneast地区。 japaneast指代Azure的日本东部区域。

容器应用环境 ɡ qì ɡ ɡ

只需要一个选项,用中文进行更改:安装扩展功能。
* 仅需要第一次安装。

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

注册Microsoft.App命名空间。
$ az provider register –namespace Microsoft.App

注册Microsoft.OperationalInsights提供程序。
$ az provider register –namespace Microsoft.OperationalInsights

创建容器化应用环境。
※ 由于基于Kubernetes平台,所以需要一些时间。

$ az containerapp env create \
    --resource-group $resource_group_name \
    --name $containerapp_env_name \
    --location $location_name
打开说明。此命令用于创建Azure Container Apps环境。

命令
说明

az containerapp env create
用于创建Container Apps环境的命令。

选项

说明

–resource-group
rg-hello
要部署应用程序的资源组名称。

–name
cae-hello
Container Apps环境的名称。

–location
japaneast
要创建资源组的位置。japaneast表示Azure的东日本地区。

如果要删除容器应用环境,请执行以下命令:
$ az containerapp env delete \
–resource-group $resource_group_name \
–name $containerapp_env_name

容器应用

我将创建和部署容器应用程序。
※ 请将”$USER”替换为您自己的容器存储库。

$ az containerapp create \
    --resource-group $resource_group_name \
    --environment $containerapp_env_name \
    --name $containerapp_name \
    --image $USER/$container_image_name \
    --target-port 8080 \
    --ingress 'external' \
    --min-replicas 0
打开说明。此命令用于创建Azure容器应用程序实例。以下是各个选项的执行内容。

命令 内容
az containerapp create 用于创建容器应用程序的命令。

选项 值 内容
–resource-group rg-hello 指定要部署资源所属的资源组名称。
–environment cae-hello 指定容器应用程序环境的名称。
–name ca-hello-spring-boot 指定容器应用程序的名称。
–image $USER/app-hello-spring-boot:latest 指定要运行的容器镜像的名称。这里使用了在前面步骤中推送到Docker Hub的镜像名称。
–target-port 8080 指定容器公开的端口。这里是因为Spring Boot应用程序在端口8080上公开,所以指定为8080。
–ingress ‘external’ 指定允许从外部访问容器的入口设置。这里指定为允许外部访问的’external’。
–min-replicas 0 指定最小副本数。这里将最小副本数设置为0。

–将”min-replicas 0″设置为应用程序在300秒内没有访问时进入零缩放状态。
如果要删除容器应用程序,请执行以下命令:
$ az containerapp delete \
–resource-group $resource_group_name \
–name $containerapp_name

使用shell变量containerapp_fqdn获取容器应用的FQDN。

$ containerapp_fqdn=$(az containerapp show \
    --resource-group $resource_group_name \
    --name $containerapp_name \
    --query 'properties.configuration.ingress.fqdn' \
    --output tsv)

确认容器应用的完全限定域名(FQDN)。

$ set | grep containerapp_fqdn
containerapp_fqdn=ca-hello-spring-boot.wonderfulgrass-e3276e77.japaneast.awsomecontainerapps.io

确认 Azure 门户

image.png
通过之前的工作,我们成功地将容器应用部署到了Azure Container Apps。

确认容器操作

从终端使用curl命令进行确认。

$ curl https://$containerapp_fqdn/api/data -w '\ntime_total: %{time_total}s\n'

产出(※省略了time_total)

{"message":"Hello World!"}
在终端上显示了{“message”:”Hello World!”},并成功获取了JSON数据。

连接到容器

$ az containerapp exec \
    --resource-group $resource_group_name \
    --name $containerapp_name

连接到容器后,请确认目录。
※ 退出容器时按下 ctrl + D。

使用az containerapp exec命令可用于在Azure容器应用程序中执行与容器的交互式shell。
# pwd
/app
# ls -lah
total 17M
drwxr-xr-x 1 root root 4.0K Aug  2 00:00 .
drwxr-xr-x 1 root root 4.0K Aug  2 01:22 ..
-rw-r--r-- 1 root root  17M Aug  1 23:46 app.jar

使用top命令来查看系统状态。

top - 01:24:20 up  8:54,  0 users,  load average: 0.14, 0.22, 0.18
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.0 us,  0.8 sy,  0.0 ni, 96.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15990.8 total,   4770.9 free,   2144.2 used,   9075.8 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  13491.0 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0 3518000 129108  20636 S   0.0   0.8   0:05.56 java
     33 root      20   0    2616    528    464 S   0.0   0.0   0:00.00 sh
     40 root      20   0    9080   3692   3180 R   0.0   0.0   0:00.00 top

以下是使用top命令显示CPU信息的情况。

top - 01:24:28 up  8:54,  0 users,  load average: 0.13, 0.22, 0.18
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu0  :  3.0 us,  0.7 sy,  0.0 ni, 96.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  2.0 us,  0.7 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu2  :  3.3 us,  0.7 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  1.7 us,  1.0 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15990.8 total,   4765.2 free,   2149.5 used,   9076.0 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  13485.6 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0 3518000 129108  20636 S   0.0   0.8   0:05.57 java
     33 root      20   0    2616    528    464 S   0.0   0.0   0:00.00 sh
     40 root      20   0    9080   3692   3180 R   0.0   0.0   0:00.00 top

让我尝试显示容器的信息。

# cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
此容器是基于Ubuntu创建的,也就是说,可以像使用Ubuntu一样对待它。

表演成绩的测量

集装箱环境

項目バージョンBase ImageUbuntu 20.04.6 LTSJVMopenjdk version “11.0.18” 2023-01-17Spring Bootv2.7.8

容器资源分配

項目設定値CPU コアの数0.5メモリ サイズ(Gi)1Gi

请求处理完成所需时间。

No状況リクエスト所要時間(秒)1デプロイ直後0.359941秒2連続して2回目0.198545秒3さらに3回目0.215914秒4スケールゼロ回復直後15.883182秒5連続して2回目0.193921秒6さらに3回目0.190443秒

日志流:显示启动时间的日志

状況アプリ起動時間(秒)デプロイ直後8.001秒スケールゼロ回復直後8.197秒
2023-08-02T00:57:26.494853482Z 2023-08-02 00:57:26.494  INFO 1 --- [           main] com.example.springboot.Application       : Started Application in 8.001 seconds (JVM running for 9.591)
2023-08-02T01:10:53.504096753Z 2023-08-02 01:10:53.503  INFO 1 --- [           main] com.example.springboot.Application       : Started Application in 8.197 seconds (JVM running for 9.837)

指标:中央处理器使用率

状況CPU使用率デプロイ後:ピーク値0.0953コアスケールゼロ回復後:ピーク値0.08コア

度量:内存使用量

状況メモリ使用量デプロイ後:ピーク値115.9MBスケールゼロ回復後:ピーク値118.3MB
应用程序从”Scale Zero”状态重新变为活动状态后,我们可以看到在处理请求之前需要很长时间的情况。然而,通过设置 “–min-replicas 1″,可以避免”Scale Zero”状态。

总结

我可以在Azure Container Apps环境中启动通过Dockerfile构建的Spring Boot Web服务的自定义容器映像。

您可以使用Maven、Docker和Azure CLI来通过终端从Spring Boot应用程序的开发到创建容器映像,再到部署到Azure环境的整个过程。通过这种方式,您可以增进在云端系统开发方面所需的技能和理解。即使是初学者也能轻松跟随步骤,所以请务必尝试一下。

请问您的体验如何?您可以使用WSL Ubuntu,通过Azure容器应用环境轻松将Spring Boot Web应用程序作为容器运行。请务必尝试。我们还将继续介绍Azure的开发环境等内容,请敬请期待。

我们来比较一下

您可以查看有关实施与本次相同规格的文章。

 

广告
将在 10 秒后关闭
bannerAds