---
url: /courses/cloud-platform-build-management/lab-06/index.md
---
# 实训 06：Compose 多服务依赖与故障闭环

所有操作限定在 `~/cloud-course/lab-06`，项目名为 `cloud-course-lab-06`。

## 一、目标和证据

* 读懂 Web、API、内部网络和回环端口；
* 启动双服务项目并从浏览器访问；
* 停止 API，比较容器状态与业务状态；
* 根据 HTTP 和 Web 日志恢复服务；
* 运行验收并清理本项目。

## 二、安全边界

* 不运行针对所有容器的批量停止或删除命令。
* 不修改现有业务端口，不将 18006 改为公网绑定。
* 只停止 `cloud-course-lab-06` 中的 `api`。
* `.env` 不保存账号或密码，也不上传。

## 三、任务 1：准备并检查配置

把 starter 完整复制到 ECS 的实验目录：

```bash
[ECS] mkdir -p ~/cloud-course/lab-06
[ECS] cd ~/cloud-course/lab-06
[ECS] cp .env.example .env
[ECS] chmod 600 .env
```

检查：

```bash
[ECS] docker compose config --services
[ECS] docker compose config --images
[ECS] docker compose config --quiet
```

截图 1：服务名、镜像和配置检查。\
记录：哪项检查只读配置，哪项还需要运行后验证。

## 四、任务 2：启动前预检

```bash
[ECS] free -h
[ECS] docker compose ls
[ECS] ss -lnt 'sport = :18006'
```

确认可用内存、现有项目和端口。18006 被占用时停止操作，保留证据并请教师分配其他课程端口。

## 五、任务 3：启动并检查内部链路

```bash
[ECS] docker compose up -d
[ECS] docker compose ps
[ECS] docker compose exec web getent hosts api
[ECS] docker compose exec web wget -qO- http://api/status.json
[ECS] curl -sS http://127.0.0.1:18006/api/status.json
```

截图 2：容器与端口。\
截图 3：服务名解析、内部 HTTP 与宿主机 HTTP。

检查点：

* API 没有宿主机端口映射；
* Web 只绑定 `127.0.0.1:18006`；
* 两种 HTTP 请求都返回 `status=ok`。

## 六、任务 4：浏览器访问

在 WSL 保持隧道：

```bash
[WSL] ssh -N -L 18006:127.0.0.1:18006 你的ECS登录目标
```

Windows 浏览器打开 `http://127.0.0.1:18006/`。

截图 4：页面显示“API 状态：ok”。\
说明：为什么这比只看两个容器 `Up` 多验证了一层。

## 七、任务 5：停止 API 并恢复

保存正常响应：

```bash
[ECS] curl -sS http://127.0.0.1:18006/api/status.json
```

只停止 API：

```bash
[ECS] docker compose stop api
```

观察：

```bash
[ECS] docker compose ps
[ECS] curl --max-time 8 -sS -o /dev/null -w 'http=%{http_code}\n' \
  http://127.0.0.1:18006/api/status.json
[ECS] docker compose logs --since 30s --tail 8 web
```

恢复：

```bash
[ECS] docker compose start api
[ECS] docker compose ps
[ECS] curl -sS http://127.0.0.1:18006/api/status.json
```

截图 5：API 停止、Web 仍运行、请求失败和日志。\
截图 6：API 恢复及 JSON 回归。

故障工单：

```txt
原始正常证据：
停止对象：
Web 容器状态：
业务 HTTP 状态：
关键日志：
故障层：
恢复操作：
回归结果：
```

## 八、任务 6：验收和清理

```bash
[ECS] bash verify.sh
[ECS] docker compose down
[ECS] ss -lnt 'sport = :18006'
```

`verify.sh` 在服务运行时检查完整链路。清理后再次检查端口，空输出表示课程入口已经释放。

最终上传：

```txt
班级_学号_姓名_第06次课_DockerCompose多服务报告.docx
```

只交 Word，并确认智慧职教显示提交成功。
