连接到通过 Azure App Service 部署的 Spring Boot 容器的 SSH

连接到在 Azure App Service 上部署的 Spring Boot 容器进行 SSH 接入。

spring-boot_on_azure-app-service.png

目标

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

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

 

实现

连接到在Microsoft Azure应用服务上部署的Spring Boot WEB应用的自定义容器的SSH。

这篇文章是前一篇相关文章的续篇。

 

在这篇文章中,我们使用了可公开访问的自定义容器镜像来发布到Docker Hub。实际的系统开发中,获取容器镜像的注册表可能会有所不同,请适时进行确认。另外,Azure还提供了完全托管的注册表服务,称为Azure容器注册表。我们也可以使用Azure CLI来操作它,我会在另一个机会中介绍。

技术专题

SSH 是什么?

可以展开这个以进行查看。SSH(安全外壳协议)

SSH是一种通过网络进行安全通信的协议之一。SSH可以加密通信路径,减少非法访问和窃听等安全风险。SSH主要用于远程访问和文件传输等目的。

研发环境

    Windows 11 Home 22H2 を使用しています。
由于我们将操作WSL的Ubuntu,所以也请macOS用户参考。
這是WSL(Microsoft Store應用程式版)。請在這篇相關文章中查看安裝方法。
> wsl –version
WSL 版本:1.0.3.0
內核版本:5.15.79.1
WSLg 版本:1.0.47這是Ubuntu。請在這篇相關文章中查看安裝方法。
$ lsb_release -a
沒有可用的LSB模塊。
發行商ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
發行版:22.04

這是Java JDK。請在這篇相關文章中查看安裝方法。
$ java -version
openjdk版本:”11.0.18″ 2023年01月17日
OpenJDK運行時環境(版本11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64位服務器VM(版本11.0.18+10-post-Ubuntu-0ubuntu122.04,混合模式,共享)

這是Maven。請在這篇相關文章中查看安裝方法。
$ mvn -version
Apache Maven 3.6.3
Maven首頁:/usr/share/maven
Java版本:11.0.18,供應商:Ubuntu,運行時:/usr/lib/jvm/java-11-openjdk-amd64

這是Docker。請在這篇相關文章中查看安裝方法。
$ docker –version
Docker版本 23.0.1,構建:a5ee5b1

这篇文章主要介绍了如何在Ubuntu终端上操作。针对初次学习使用Vim复制粘贴的人,以下文章中介绍了相应步骤。请务必尝试一下。

 

展示”Hello World”的步骤

创建Spring Boot Web服务

这篇文章将从之前的相关文章继续讲解步骤。

 

切换到Spring Boot应用的项目文件夹。

我們將切換到專案資料夾。
※ 假設 ~/tmp/hello-spring-boot 為一個專案資料夾。

$ cd ~/tmp/hello-spring-boot

创建容器映像

为了在容器中进行SSH连接,本文将介绍如何使用自定义的Dockerfile构建自定义的容器镜像,而不是使用spring-boot:build-image构建容器镜像。

创建sshd_config文件。

$ vim sshd_config

文件的内容

Port                2222
ListenAddress       0.0.0.0
LoginGraceTime      180
X11Forwarding       yes
Ciphers aes128-cbc,3des-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr
MACs hmac-sha1,hmac-sha1-96
StrictModes         yes
SyslogFacility      DAEMON
PasswordAuthentication  yes
PermitEmptyPasswords    no
PermitRootLogin     yes
Subsystem sftp internal-sftp
打开说明。sshd_config文件的内容。

该文件是OpenSSH守护进程的配置文件,用于定制在容器内运行的SSH服务器的设置。该文件将通过Dockerfile中的COPY命令复制到/etc/ssh/目录下。

内容

将SSH服务器的监听端口号设置为2222。

将登录时显示的消息显示时间设置为180秒。

启用X11转发。

指定加密算法和MAC算法。

通过将StrictModes设置为yes,禁止用户直接访问家目录。

允许密码认证,并设置不允许空密码。

将PermitRootLogin设置为yes。这样可以使用root用户进行SSH连接。

通过设置Subsystem sftp internal-sftp,启用SFTP子系统,实现文件传输的功能。

创建ssh_setup.sh文件。

$ vim ssh_setup.sh
#!/bin/sh

# generate an ssh host keys.
ssh-keygen -A

# prepare a run dir.
if [ ! -d "/var/run/sshd" ]; then
    mkdir -p /var/run/sshd
fi
打开说明。ssh_setup.sh 文件的内容。

该脚本执行 ssh-keygen -A 命令以生成用于 OpenSSH 的密钥对,并执行 mkdir 命令以创建 /var/run/sshd 目录。

如果 /var/run/sshd 目录不存在,则创建该目录。该脚本在构建容器映像时执行,并进行 SSH 服务启动所需的准备。

创建startup.sh文件。

$ vim startup.sh
#!/bin/sh

# startup openssh daemon.
/usr/sbin/sshd

# startup a jvm app.
java -jar app.jar
打开说明。startup.sh文件的内容

此脚本通过启动OpenSSH守护程序并运行Java应用程序来执行容器的启动过程。

命令
内容

#!/bin/sh
这是一个Shell脚本声明。

/usr/sbin/sshd
启动OpenSSH守护程序。这将使得可以通过SSH访问容器内部。

java -jar app.jar
启动Java应用程序。java命令启动Java运行时,并且-jar选项表示执行指定的JAR文件。app.jar是要启动的应用程序的JAR文件。

修改 Dockerfile。

$ vim Dockerfile

文件的内容 de

# from the base image of a jdk 11 container on Ubuntu 20.04.
FROM adoptopenjdk/openjdk11:x86_64-ubuntu-jdk-11.0.18_10-slim

# create a work dir.
WORKDIR /app

# update the package list.
RUN apt-get -y update

# install openssh and set the password for root to "Docker!".
RUN apt-get install -y openssh-server \
     && echo "root:Docker!" | chpasswd 

# copy the sshd_config file to the /etc/ssh/ dir.
COPY sshd_config /etc/ssh/

# copy and configure the ssh_setup file.
COPY ssh_setup.sh .
RUN chmod +x ssh_setup.sh \
    && (sleep 1;/app/ssh_setup.sh 2>&1 > /dev/null)

# copy and configures the startup file.
COPY startup.sh .
RUN chmod +x startup.sh 

# copy the jvm app.
COPY target/*.jar app.jar

# open port 8080 for jvm app and port 2222 for ssh access.
EXPOSE 8080 2222

# exec the startup script.
ENTRYPOINT ["/app/startup.sh"]
打開文件說明。Dockerfile的內容

這個Dockerfile構建了一個基於Ubuntu 20.04的JRE容器映像,具體來說,它以AdoptOpenJDK提供的OpenJDK 11為基礎。

指令
內容

FROM adoptopenjdk/openjdk11:x86_64-ubuntu-jdk-11.0.18_10-slim
指定以AdoptOpenJDK提供的OpenJDK 11為基礎,在x86_64架構的Ubuntu 20.04上執行的JRE容器。

WORKDIR /app
創建/app目錄並設置為後續工作目錄。

RUN apt install openssh && echo “root:Docker!” | chpasswd
安裝OpenSSH並將root用戶的密碼設置為Docker!。

COPY sshd_config /etc/ssh/
將sshd_config文件複製到/etc/ssh/目錄中。該文件定義了SSH守護進程的配置。

COPY ssh_setup.sh .
將ssh_setup.sh文件複製到容器內的工作目錄。該腳本用於設置SSH連接並在容器啟動時執行。

RUN chmod +x ssh_setup.sh && (sleep 1;/app/ssh_setup.sh 2>&1 > /dev/null)
給ssh_setup.sh文件授予執行權限,並執行以設置SSH連接。

COPY startup.sh .
將startup.sh文件複製到容器內的工作目錄。該腳本用於在容器啟動時運行JVM應用程序。

RUN chmod +x startup.sh
給startup.sh文件授予執行權限。

COPY target/*.jar app.jar
將編譯好的JVM應用程序的Jar文件複製到容器內的app.jar文件中。

EXPOSE 8080 2222
公開容器的8080和2222端口。

ENTRYPOINT [“/app/startup.sh”]
在容器啟動時執行startup.sh腳本,並運行JVM應用程序。

检查Docker环境。

$ docker --version
Docker version 23.0.1, build a5ee5b1
如果您没有Docker环境,请您点击下方相关文章了解如何安装Docker Engine。

 

构建容器镜像。

$ docker build --no-cache -t app-hello-spring-boot-ssh .

查看容器镜像。

$ docker images | grep app-hello-spring-boot-ssh
app-hello-spring-boot-ssh   latest    4a94045f5846   8 seconds ago   545MB

启动容器镜像

在本地启动容器映像并进行确认。

$ docker run --name app-local -p 8080:8080 app-hello-spring-boot-ssh

停止本地容器。

$ docker stop app-local

在Docker Hub上注册容器映像。

创建Docker Hub账户。

 

Docker Hub 是用于共享、存储和管理容器的云注册表。Docker Hub 存储了由社区创建的官方和社区镜像。此外,用户也可以上传和共享自定义容器镜像。

登录Docker Hub。

$ docker login
Login Succeeded

给容器图像打标签。
※ 将 “$USER” 替换为您自己的容器仓库。

$ docker tag app-hello-spring-boot-ssh $USER/app-hello-spring-boot-ssh:latest

将容器镜像推送到 Docker Hub。

$ docker push $USER/app-hello-spring-boot-ssh:latest

到目前为止,我已经将自定义容器映像发布到Docker Hub,命名为$USER/app-hello-spring-boot-ssh:latest。

在Azure环境中登录

这篇文章将从相关文章的延续中介绍步骤。

 

使用 Azure CLI 进行登录。

$ az login

蔚藍的环境

资源组

创建资源组。

$ az group create \
    --name rg-hello \
    --location japaneast

应用服务计划

创建一个App Service计划。

$ az appservice plan create \
    --resource-group rg-hello \
    --name asp-hello \
    --sku Free \
    --is-linux

应用服务网络应用

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

$ az webapp create \
    --resource-group rg-hello \
    --plan asp-hello \
    --name app-hello-spring-boot-ssh \
    --deployment-container-image-name $USER/app-hello-spring-boot-ssh:latest

配置 Web 应用程序的设置。
※ App Service Web 应用程序默认监听80端口。

$ az webapp config appsettings set \
    --resource-group rg-hello \
    --name app-hello-spring-boot-ssh \
    --settings WEBSITES_PORT=8080

确认 Web 应用的运行情况

执行以下命令,将会启动Web浏览器。

$ az webapp browse \
    --resource-group rg-hello \
    --name app-hello-spring-boot-ssh
尽管需要一些时间来启动,但页面会显示出来。然而,显示出来的页面 “/” 没有设置内容。
image.png
https://app-hello-spring-boot-ssh.awesomewebsites.net/api/data

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

我会在另一个终端使用curl命令来进行确认。

$ curl -v https://app-hello-spring-boot-ssh.awesomewebsites.net/api/data

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

Azure App Service 支持 SSL/TLS 和 HTTP/2 协议。

连接到容器

使用SSH连接到容器。

$ az webapp ssh \
    --resource-group rg-hello \
    --name app-hello-spring-boot-ssh
启动说明。此命令会为Azure App Service Web应用建立SSH连接。

命令
说明

az webapp ssh
用于建立SSH连接到App Service Web应用的命令。

选项

说明

–resource-group
rg-hello
指定包含App Service Web应用的资源组名称。

–name
app-hello-spring-boot-ssh
指定App Service Web应用的名称。

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

# pwd
/root
# cd /app
# ls -la
total 17256
drwxr-xr-x    2 root     root          4096 Mar  8 11:18 .
drwxr-xr-x   59 root     root          4096 Mar  8 11:34 ..
-rw-r--r--    1 root     root      17650443 Mar  8 07:17 app.jar
-rwxr-xr-x    1 root     root           107 Mar  8 10:30 ssh_setup.sh
-rwxr-xr-x    1 root     root            70 Mar  8 11:16 startup.sh

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

# 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 一样处理。

Azure 门户

image.png

注意事项

微软发布了使用自定义容器进行SSH支持的方法。

 

然而,由于对容器的可移植性存在顾虑,在实际系统开发中建议避免在创建容器镜像时特别添加执行SSH守护程序的配置。Azure提供了名为Container Apps的自定义容器镜像部署方法。

本文介绍了如何使用Azure容器应用程序。

 

总结

我能够在Azure App Service环境中,连接到使用Dockerfile构建的Spring Boot Web服务的自定义容器。

你可以使用Maven、Docker和Azure CLI来从开发Spring Boot应用程序到创建容器映像并部署到Azure环境,而且全部可以在终端上完成。通过这种方式,您可以提升在云端系统开发所需的技能和理解。即使是初学者,也可以轻松地按照步骤进行操作,所以请务必尝试一下。

请问您的使用感受如何?您可以在WSL Ubuntu上将Spring Boot Web应用程序部署到Azure App Service环境中,并轻松地通过SSH连接到容器中,以进行验证。请务必尝试一下。我们将继续介绍Azure的开发环境等内容,请随时期待。

推荐内容

 

bannerAds