使用 ACI (Azure 容器实例) 在 Spring Boot WEB 服务中启动 (ACR 自定义容器镜像)

使用ACI (Azure容器实例) 在Spring Boot WEB服务上启动 (ACR自定义容器映像)

Goal

在Azure容器实例环境中启动Spring Boot WEB服务,以加深对其的理解。

实现

将Spring Boot WEB应用的自定义容器镜像部署到Microsoft Azure容器实例(ACI)。

技术背景

微软Azure容器实例(ACI)是什么?

通过展开此处即可查看。Microsoft Azure 容器应用(ACA)

Microsoft Azure 容器实例(ACI)是一种可以轻松部署和运行容器的托管容器执行环境。在构建云原生应用程序和微服务时,它具有高度灵活且简化的配置,可以轻松运行容器。
此外,由于费用形式可以精确到秒的计费单位,因此可以根据使用方式进行最佳成本管理。

研发环境

    • 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 (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)

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

创建容器镜像

构建容器镜像

在本地的Docker环境(Docker Desktop)中,将创建一个名为app-hello-spring-boot的容器镜像。
容器镜像的创建时间为Unix纪元是由spring-boot:build-image的规范决定的。

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

确认容器映像

$ docker images | grep app-hello-spring-boot-app
app-hello-spring-boot-app   latest   e37cc77f2b36   43 years ago   262MB

获取Azure账户

使用Azure的免费账户在云端构建。

用 Azure CLI 登录

请您参考安装 Azure CLI 的步骤。

$ az login

蔚藍色的环境

资源组

创建资源组

$ 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 容器注册表中。

ACI环境可以用中文本地化.

创建和部署容器组

$ az container create \
    --resource-group rg-hello \
    --name ci-hello \
    --image cr20230212.azurecr.io/app-hello-spring-boot:latest \
    --registry-login-server cr20230212.azurecr.io \
    --registry-username cr20230212 \
    --registry-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --ip-address public \
    --ports 8080

如果要删除容器组

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

获取容器组的IP地址

$ az container show \
    --resource-group rg-hello \
    --name ci-hello \
    --query ipAddress.ip \
    --output tsv
20.222.223.225

请使用网络浏览器进行确认
※ 请根据环境更改URL。

http://20.222.223.225:8080/api/data

通过 WEB 浏览器以 {“message”:”Hello World!”} 的形式显示,并成功获取了 JSON 数据。

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

$ curl -v http://20.222.223.225:8080/api/data
*   Trying 20.222.223.225:8080...
* Connected to 20.222.223.225 (20.222.223.225) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: 20.222.223.225:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Mon, 27 Feb 2023 08:12:19 GMT
<
* Connection #0 to host 20.222.223.225 left intact
{"message":"Hello World!"}

我能在终端上看到{“message”:”Hello World!”}的信息,并且成功获取了JSON数据。

※ 看起来在 Azure 这一侧没有进行 SSL/TLS支持或应用HTTP/2协议。

连接到容器

$ az container exec \
    --resource-group rg-hello \
    --name ci-hello \
    --exec-command "/bin/bash"

连上容器后

$ 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 08:10 ..
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サービスのカスタムコンテナイメージを ACI (Azure Container Instances) 環境で起動させることが出来ました。

请参考。

(Translation: Please refer to this.)

Azure容器实例(ACI)命令参考文档

bannerAds