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

目标
我将使用Windows 11中的Linux进行云端开发。
您可以在这里查看文章列表。
实现
连接到在Microsoft Azure应用服务上部署的Spring Boot WEB应用的自定义容器的SSH。
这篇文章是前一篇相关文章的续篇。
技术专题
SSH 是什么?
SSH是一种通过网络进行安全通信的协议之一。SSH可以加密通信路径,减少非法访问和窃听等安全风险。SSH主要用于远程访问和文件传输等目的。
研发环境
- Windows 11 Home 22H2 を使用しています。
> 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
展示”Hello World”的步骤
创建Spring Boot Web服务
这篇文章将从之前的相关文章继续讲解步骤。
切换到Spring Boot应用的项目文件夹。
我們將切換到專案資料夾。
※ 假設 ~/tmp/hello-spring-boot 為一個專案資料夾。
$ cd ~/tmp/hello-spring-boot
创建容器映像
创建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
该文件是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-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
此脚本通过启动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構建了一個基於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 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 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

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数据。
连接到容器
使用SSH连接到容器。
$ az webapp ssh \
--resource-group rg-hello \
--name app-hello-spring-boot-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
Azure 门户

注意事项
微软发布了使用自定义容器进行SSH支持的方法。
本文介绍了如何使用Azure容器应用程序。
总结
我能够在Azure App Service环境中,连接到使用Dockerfile构建的Spring Boot Web服务的自定义容器。
请问您的使用感受如何?您可以在WSL Ubuntu上将Spring Boot Web应用程序部署到Azure App Service环境中,并轻松地通过SSH连接到容器中,以进行验证。请务必尝试一下。我们将继续介绍Azure的开发环境等内容,请随时期待。
推荐内容