---
url: /courses/cloud-platform-build-management/lab-14/index.md
---
# 实训 14：Compose 标准发布包与重复部署

使用云主机 B 的课程专用目录或本人已授权的 ECS；入口只绑定回环地址。

## 一、实训目标

* 核对标准发布包目录；
* 展开 Compose 最终配置；
* 部署并验证两项服务健康；
* 完成第二次部署与一致性检查；
* 恢复缺失 `.env` 故障并安全清理。

## 二、环境与安全边界

* 只使用教师分配的目录、项目名和端口。
* 不改已有业务端口，不停止未知容器。
* `.env` 不进入报告或压缩包。
* 不执行全局容器、镜像、卷或网络清理。
* 本课默认端口为远端 `127.0.0.1:18014`；多人并行时按教师分配值修改。

## 三、准备标准包

```bash
[ECS] cd /opt/xpk-course-demos/lesson-14/release
```

用途：进入课程专用目录。本人 ECS 按教师给出的目录调整。

```bash
[ECS] find . -maxdepth 2 -type f -print
```

用途：列出发布包文件。预期包含 Compose、变量示例、三项脚本、应用文件和 Nginx 配置。

```bash
[ECS] cp .env.example .env
```

用途：创建本次部署变量。复制后核对项目名和端口，不截图 `.env` 的私密项目。

截图 1：发布包文件和已确认的非敏感变量名。

## 四、展开配置

```bash
[ECS] docker compose --env-file .env config --services
```

用途：列出最终服务。预期为 `api` 和 `web`。

```bash
[ECS] docker compose --env-file .env config --environment \
  | grep -E '^(COMPOSE_PROJECT_NAME|COURSE_PORT)='
```

用途：只显示允许进入截图的项目名和端口。不要截图未经筛选的完整输出，其中可能包含 SSH 连接地址或其他当前 Shell 环境变量。

```bash
[ECS] docker compose --env-file .env config
```

用途：查看规范化模型。核对 `service_healthy`、两项 healthcheck、`host_ip: 127.0.0.1` 和发布端口。

截图 2：展开后的依赖、健康与端口边界。

## 五、首次部署与验收

```bash
[ECS] ./deploy.sh
```

用途：配置检查后启动，并等待服务 healthy。预期两项 PASS。

```bash
[ECS] docker compose --env-file .env ps
```

用途：查看 api/web 状态。预期均为 healthy，只有 web 映射宿主机回环端口。

```bash
[ECS] ./verify.sh
```

用途：检查配置、服务、端口、容器健康、主页和 API。预期全部 PASS。

截图 3：状态与自动验收。

## 六、第二次部署

```bash
[ECS] docker compose --env-file .env ps -q api
```

用途：记录 api 容器 ID 前 12 位。对 web 重复一次。

```bash
[ECS] ./deploy.sh
```

用途：从同一标准包再次部署。配置未变时预期容器保持 Running/Healthy。

```bash
[ECS] ./verify.sh
```

用途：沿相同路径再次验收。比较部署前后容器 ID、项目名、端口和页面版本。

截图 4：第二次部署及前后对比。

## 七、缺少 `.env` 的故障恢复

```bash
[ECS] mv .env .env.saved
```

用途：保存原文件并制造缺失 `.env` 的可恢复故障。

```bash
[ECS] ./deploy.sh
```

用途：观察脚本尽早失败。预期不会改变现有容器。

```bash
[ECS] mv .env.saved .env
```

用途：恢复原变量文件。

```bash
[ECS] ./deploy.sh && ./verify.sh
```

用途：重新部署并同路回归。预期全部通过。

截图 5：原始报错、恢复命令和回归结果。

## 八、人工检查

* 目录中的相对路径都指向发布包内部；
* `.env` 和 `evidence/` 命中 `.gitignore`；
* healthcheck 真正访问应用路径；
* 第二次部署没有出现重复项目；
* 报告不含 `.env`、完整容器 ID、地址或日志全集。

## 九、清理与提交

```bash
[ECS] ./cleanup.sh
```

用途：只清理本课 Compose 项目。

```bash
[ECS] ss -lnt 'sport = :18014'
```

用途：确认本课端口释放。

```bash
[ECS] docker ps --format '{{.Names}} {{.Ports}}'
```

用途：确认既有业务容器仍在运行。

提交：

```txt
班级_学号_姓名_第14次课_Compose标准化交付报告.docx
```

只提交一个 Word 到智慧职教“第14次课”。
