连接到在Azure App Service上部署的Spring Boot容器的SSH
连接到部署在 Azure App Service 上的 Spring Boot 容器的 SSH。
策略
Note: The translation may vary depending on the context and the specific meaning of “目的”.
在Azure App Service环境中启动Spring Boot WEB服务,以加深理解。
实现
将Spring Boot WEB应用程序连接到Microsoft Azure App Service的自定义容器通过SSH。
這是這篇文章的續篇。
我们还有以下文章作为使用Microsoft Azure Container Registry (ACR) 进行配置的示例。
科技背景
SSH 的意思是什么?
SSH是一种用于通过网络进行安全通信的协议。SSH通过加密通信路径可以减少安全风险,如非法访问和窃听。SSH主要用于远程访问和文件传输等目的。
开发环境
-
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
> 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服务
您可以查看这里。
切换到项目文件夹
※ 假设 ~/tmp/hello-spring-boot 是项目文件夹。
$ cd ~/tmp/hello-spring-boot
使用Java编译构建应用程序(※参考)
您可以参考这个。
创建容器镜像
为了在容器中进行SSH连接,本文介绍了一个示例,不是使用spring-boot:build-image构建容器镜像,而是使用自定义Dockerfile构建自定义容器镜像。
创建sshd_config文件
$ vim sshd_config
文件的内容 de
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守护程序的配置文件,用于自定义在Docker容器中运行的SSH服务器的配置。该文件会被复制到Dockerfile中的”/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 ssh host keys.
ssh-keygen -A
# prepare 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”目录不存在,则会进行创建。该脚本在构建Docker镜像时执行,并进行SSH服务启动所需的准备工作。
创建一个 startup.sh 文件。
$ vim startup.sh
#!/bin/sh
# startup openssh daemon.
/usr/sbin/sshd
# startup 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
文件的内容
# 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 work dir.
WORKDIR /app
# update 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/ directory.
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的JVM容器的Docker镜像。具体来说,它以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 Desktop)中创建app-hello-spring-boot Docker镜像。
$ docker build --no-cache -t app-hello-spring-boot .
确认容器镜像
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest 10c6cdc26e44 52 seconds ago 544MB
在本地启动容器映像并确认
$ docker run --name app-local -p 8080:8080 app-hello-spring-boot
将容器镜像上传到Docker Hub
请将 $USER 替换为您自己的容器注册表。
添加标签 (Tianjiā
$ docker tag app-hello-spring-boot $USER/app-hello-spring-boot:latest
打推。
$ docker push $USER/app-hello-spring-boot:latest
在Docker Hub上成功发布了名为$USER/app-hello-spring-boot:latest的定制容器镜像。
获取 Azure 帐户
使用Azure的免费账户在云上进行构建。
使用 Azure 命令行界面进行登录
您可以参考这个。
登录
$ az login
如果需要更新至最新版本
$ az upgrade
蔚藍的环境
资源组 zú)
创建资源组
$ az group create \
--name rg-hello \
--location japaneast
显示资源组列表
$ az group list
如果你想要删除资源组。
$ az group delete -n <group>
应用服务计划
创建一个App Service计划。
$ az appservice plan create \
--resource-group rg-hello \
--name asp-hello \
--sku Free \
--is-linux
显示App Service方案的列表
$ az appservice plan list
如果要删除App Service计划。
$ az appservice plan delete -n <plan> -g <group>
应用服务网络应用
Azure App Service 可以使用几种方法部署 Spring Boot 应用的 Docker 镜像,但本次将介绍使用 Azure CLI 部署 Docker Hub 上公开的自定义容器镜像的方法。
创建和部署Web应用程序
※ 请将$USER替换为您自己的容器注册表。
$ az webapp create \
--resource-group rg-hello \
--plan asp-hello \
--name app-hello-spring-boot \
--deployment-container-image-name $USER/app-hello-spring-boot:latest
配置web应用程序的设置
※ App Service Web 应用程序默认情况下监听80端口。
$ az webapp config appsettings set \
--resource-group rg-hello \
--name app-hello-spring-boot \
--settings WEBSITES_PORT=8080
网络应用程序的日志记录配置
$ az webapp log config \
--resource-group rg-hello \
--name app-hello-spring-boot \
--docker-container-logging filesystem \
--application-logging filesystem \
--web-server-logging filesystem
通过网络浏览器进行访问
$ az webapp browse \
--resource-group rg-hello \
--name app-hello-spring-boot
※ 虽然页面加载需要一些时间,但会显示页面。然而,显示的页面 “/” 没有设置任何内容。
请再次使用网络浏览器确认
※ 请根据环境替换URL。
https://app-hello-spring-boot.azurewebsites.net/api/data
在WEB浏览器中成功显示了{“message”:”Hello World!”}并获取了JSON数据。
用SSH连接到容器
$ az webapp ssh \
--resource-group rg-hello \
--name app-hello-spring-boot
容器连接之后
# pwd
/root
# cd /app
# ls -la
total 17256
drwxr-xr-x 2 root root 4096 Feb 27 11:18 .
drwxr-xr-x 59 root root 4096 Feb 27 11:34 ..
-rw-r--r-- 1 root root 17650443 Feb 27 07:17 app.jar
-rwxr-xr-x 1 root root 107 Feb 27 10:30 ssh_setup.sh
-rwxr-xr-x 1 root root 70 Feb 27 11:16 startup.sh
容器的信息 de
# 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 App Service 環境で動作している Spring Boot WEBサービスのカスタムコンテナに SSH で接続することが出来ました。
个人观点
-
- コンテナに SSH 接続する為に、SSH 接続用の設定ファイルや、Dockerfile に専用の設定を加える方法に問題があると感じました。
それは、Azure のその他のコンテナイメージをデプロイ可能であるサービスにおいてはそれらは必要ないという観点からです。
これらの追加設定により、コンテナイメージが Azure App Service 専用のものとなる可能性があると思います。
その点を踏まえ、もはや Azure App Service は、素直に jar ファイル形式でビルドされたJVMアプリを運用する為の PaaS 環境として割り切った方が良いのかも知れません。
请参考
配置 Azure App Service 中的自定义容器
[Microsoft 学习] Azure 应用服务 命令参考