实操题参考答案 · Spring Demo 部署指南
本文用于指导学员在培训环境中部署 Spring Demo。镜像和 Spring Demo 全量工程包由讲师统一准备,学员不需要在服务器上克隆源码、执行 Maven 打包或构建 Docker 镜像。
部署流程:
- 登录考试环境。
- 确认个人 Demo 工程目录和学员编号。
- 修改
APP_NAME和宿主机端口。 - 检查名称、端口和目录是否冲突。
- 进入
deploy部署目录并执行bash deploy.sh local。 - 在服务器本机验证容器和测试接口。
1. 培训环境
1.1 账号信息
| 项目 | 信息 |
|---|---|
| 用户名 | train_user |
| 密码 | Train@1234 |
| Web 地址 | https://jps.yelinksaas.com |
| SSH 地址 | jps.yelinksaas.com:8422 |
1.2 登录考试环境
- 登录堡垒机。
- 进入讲师指定的考试环境3或考试环境4。
- 切换到 root 用户。


sudo su后续命令均在目标考试环境中以 root 用户执行。
2. 学员资源分配
本次培训约有 30~40 名学员。每名学员必须使用自己的编号、应用名和宿主机端口,禁止复用他人的配置。
2.1 分配规则
学员编号统一使用两位数字:
| 配置 | 规则 | 示例:01号学员 |
|---|---|---|
| Demo 工程目录 | /opt/partner/train/deploy-<两位编号> | /opt/partner/train/deploy-01 |
| 部署目录 | /opt/partner/train/deploy-<两位编号>/deploy | /opt/partner/train/deploy-01/deploy |
APP_NAME | train-<两位编号> | train-01 |
HOST_PORT | 38100 + 学员编号 | 38101 |
HOST_LOG_DIR | /opt/partner/data/${APP_NAME}/logs | /opt/partner/data/train-01/logs |
端口范围为 38101~38140。
| 学员编号 | APP_NAME | HOST_PORT |
|---|---|---|
| 01 | train-01 | 38101 |
| 05 | train-05 | 38105 |
| 10 | train-10 | 38110 |
| 20 | train-20 | 38120 |
| 30 | train-30 | 38130 |
| 40 | train-40 | 38140 |
必须使用讲师分配的编号。不要自行选择空闲端口,否则可能与其他学员后续部署冲突。
3. 复制并检查 Demo 工程包
讲师会将公共 Spring Demo 工程包放到 /opt/partner/deploy。学员从公共工程包复制自己的个人 Demo 工程目录,讲师不预先创建个人目录。以下命令以 01 号学员为例,其他学员必须替换编号。
mkdir -p /opt/partner/train
test -d /opt/partner/deploy
test ! -e /opt/partner/train/deploy-01
cp -a /opt/partner/deploy /opt/partner/train/deploy-01
cd /opt/partner/train/deploy-01
test -d deploy
cd deploy
pwd
ls -la确认当前目录为 /opt/partner/train/deploy-01/deploy,且至少包含:
.env
deploy.sh
docker-compose.yml
variables.env执行检查:
for file in .env deploy.sh docker-compose.yml variables.env; do
test -f "$file" || echo "缺少文件:$file"
done如果复制命令、部署目录检查或文件检查失败,停止操作并联系讲师,不要从其他学员目录复制文件。
部署目录中的镜像仓库和版本由讲师统一维护。除非讲师明确通知,否则不要修改 .env。
4. 修改个人实例参数
推荐使用一键命令修改本人部署目录中的 deploy.sh。以下命令以 01 号学员为例,其他学员只需要修改第一行 STUDENT_NO。
STUDENT_NO=01
APP_NAME="train-${STUDENT_NO}"
HOST_PORT="$((38100 + 10#${STUDENT_NO}))"
perl -0pi -e "s/^APP_NAME=.*/APP_NAME=\"${APP_NAME}\"/m; s/^HOST_PORT=.*/HOST_PORT=\"${HOST_PORT}\"/m; s|^HOST_LOG_DIR=.*|HOST_LOG_DIR=\"/opt/partner/data/\\\${APP_NAME}/logs\"|m" deploy.sh
grep -E '^(APP_NAME|HOST_PORT|HOST_LOG_DIR)=' deploy.sh01 号学员执行后应看到:
APP_NAME="train-01"
HOST_PORT="38101"
HOST_LOG_DIR="/opt/partner/data/${APP_NAME}/logs"如果不使用一键命令,也可以手工编辑 deploy.sh:
vi deploy.sh手工修改时,只修改顶部以下三项配置:
APP_NAME="train-01"
HOST_PORT="38101"
HOST_LOG_DIR="/opt/partner/data/${APP_NAME}/logs"修改后保存,并执行:
grep -E '^(APP_NAME|HOST_PORT|HOST_LOG_DIR)=' deploy.sh确认三项配置均属于本人。
禁止修改
- 不要修改容器内端口
38104。 - 不要修改镜像名
yelink-demo。 - 不要修改
docker-compose.yml。 - 不要修改
variables.env中由部署脚本生成的公共中间件地址。 - 不要修改他人的 Demo 工程目录、部署目录、容器、工作目录或配置目录。
APP_NAME 会同时作为 Spring 应用名、Nacos 服务名、Compose Service Name 和容器名。名称只能包含小写字母、数字和中划线。
5. 部署前冲突检查
以下命令仍以 01 号学员为例。
5.1 检查端口
ss -tlnp | grep ':38101 '无输出表示端口当前未被监听。有输出时不要更换随机端口,先核对学员编号并联系讲师。
5.2 检查容器名
docker ps -a --filter "name=^/train-01$" --format '{{.Names}}'首次部署应无输出。如果输出 train-01,说明本人的容器已存在,先确认是否属于之前的部署。
5.3 检查脚本工作目录
Demo 工程目录位于 /opt/partner/train/deploy-01,部署目录位于 /opt/partner/train/deploy-01/deploy,脚本生成的运行工作目录位于 /opt/partner/train-01,三者不是同一个目录。
ls -ld /opt/partner/train-01 /opt/partner/config/train-01 2>/dev/null首次部署应无输出。已有目录时,prepare 会停止以保护现有配置,不要直接删除。
5.4 检查公共配置
test -f /opt/config/common-variables.env \
&& echo "公共配置存在" \
|| echo "公共配置缺失,请联系讲师"公共配置由培训环境统一提供,学员不要自行创建或修改。
6. 一键部署
确认当前位于本人的部署目录:
cd /opt/partner/train/deploy-01/deploy
bash deploy.sh local脚本会自动完成:
- 校验应用名、端口和日志目录。
- 读取培训环境公共配置。
- 生成个人应用配置和 Compose 配置。
- 同步实例化后的
deploy.sh到运行工作目录。 - 拉取讲师指定的镜像。
- 启动容器。
- 等待健康检查通过。
- 输出访问地址、日志目录和配置路径。
部署成功时,终端会显示“已同步部署脚本到工作目录”“容器健康检查通过”和部署摘要。
7. 验证部署
以下命令以 01 号学员为例。
7.1 查看容器状态
docker ps --filter "name=^/train-01$"
docker inspect -f 'image={{.Config.Image}} status={{.State.Status}} health={{.State.Health.Status}}' train-01容器状态应为 running,健康状态应为 healthy。
7.2 直连应用验证
curl -f "http://127.0.0.1:38101/api/log-test/simple?message=hello"请求成功并返回包含 status、message 和 timestamp 的 JSON 数据,说明应用已经启动且接口可用。
7.3 通过网关验证
应用启动后会以 APP_NAME 注册到 Nacos。网关读取 Nacos 中的服务信息,并根据应用名称自动生成路由规则:
https://127.0.0.1:8301/<APP_NAME>/<应用接口路径>01 号学员使用以下命令验证。培训网关使用自签名证书,curl 调用 HTTPS 网关时必须带 -k:
APP_NAME=train-01
curl -k -f "https://127.0.0.1:8301/${APP_NAME}/api/log-test/simple?message=hello"其他学员只替换 APP_NAME,例如 15 号学员使用 APP_NAME=train-15。如果刚部署完成后网关首次返回 500 或 404,先等待 20~30 秒再重试。应用注册到 Nacos 后,网关自动路由可能需要短暂刷新时间。
该请求先进入网关,再由网关根据路径中的 train-01 找到 Nacos 中的同名服务并转发到应用。请求返回与直连接口一致的 JSON 数据,说明 Nacos 注册和网关自动路由均正常。
路径中的应用名称必须与
deploy.sh配置的APP_NAME完全一致。培训环境网络不支持从学员电脑直接访问应用或网关,必须登录目标考试环境后在服务器本机执行验证命令。
7.4 查看日志
docker logs --tail 200 train-01
docker logs --tail 200 -f train-01按 Ctrl+C 退出持续日志查看,不会停止容器。
应用日志同时写入:
/opt/partner/data/train-01/logs/8. 故障处理与清理
8.1 常见问题
| 现象 | 原因 | 处理方式 |
|---|---|---|
APP_NAME 校验失败 | 名称包含大写字母、下划线或格式错误 | 改为 train-<两位编号> |
| 端口已被监听 | 编号或端口填写错误,或旧实例仍在运行 | 核对 HOST_PORT,不要随机换端口 |
| 工作目录已存在 | 本人之前执行过部署 | 确认旧实例后按卸载流程处理 |
| 容器已存在 | 同名实例已经创建 | 查看容器状态和日志,不要删除他人容器 |
| 公共配置缺失 | 培训环境未准备完成 | 联系讲师,不要手工伪造配置 |
| 健康检查超时 | 中间件连接、镜像或应用启动异常 | 查看 docker logs --tail 200 <APP_NAME> |
首次部署时,部署脚本日志位于个人部署目录的 deploy_logs/ 目录。后续如果从运行工作目录执行卸载,卸载日志位于运行工作目录的 deploy_logs/ 目录。
8.2 卸载本人实例
仅在确认 APP_NAME、容器和目录均属于本人后执行:
cd /opt/partner/train-01
bash deploy.sh uninstall卸载会删除:
/opt/partner/train-01/opt/partner/config/train-01
部署成功后,脚本会把已配置好的
deploy.sh同步到/opt/partner/train-01/deploy.sh。因此即使不回到/opt/partner/train/deploy-01/deploy,也可以在运行工作目录内卸载本人实例。
卸载会保留应用日志目录:
/opt/partner/data/train-01/修正参数后可以重新执行:
bash deploy.sh local8.3 培训结束清理
先卸载本人实例,再由讲师统一确认是否删除个人 Demo 工程目录和日志目录。不要删除 /opt/partner 根目录,不要使用通配符删除个人 Demo 工程目录、工作目录、配置或日志目录。
9. 完成标准
满足以下条件即部署完成:
APP_NAME和HOST_PORT与本人学员编号一致。- 容器状态为
running。 - 容器健康状态为
healthy。 - 服务器本机直连
/api/log-test/simple成功。 - 通过网关的
/${APP_NAME}/api/log-test/simple调用成功。 - 未修改或影响其他学员的容器、端口和目录。
