logo
0
0
WeChat Login

🕵️‍♂️ Project Moby: The Silent Protocol

代号 Moby:静默协议

警告:系统核心已离线。全区进入紧急维护状态。 身份确认:DevOps 特勤组 - [学员姓名] 当前状态:等待指令...


📜 任务背景 (Mission Briefing)

我们的主控 AI "Moby" 遭遇不明故障,所有的服务容器(Containers)都已陷入瘫痪、死锁或损坏状态。整个开发环境目前处于静默隔离模式。

你被紧急唤醒。作为唯一的系统维护员,你需要通过终端(Terminal),逐一修复这些“坏掉”的舱室。

你的目标很简单:利用 Docker 技能,找到每一个关卡中隐藏的 Flag。

🎮 玩法规则

  1. Flag 格式:通常为 FLAG{...} 形式的字符串。
  2. 关卡解锁:每一关的 Flag,通常是 下一关镜像的 Tag
    • 例如:如果你在 Level 1 找到了 FLAG{secret},那么 Level 2 的拉取命令就是 docker pull [你的DockerID]/project-moby:level2-secret

🚩 关卡索引

Level 1: 沉默的黑匣子 (The Silent Black Box)

📍 场景描述: 控制台显示“生命维持系统”启动失败。当我们尝试启动这个容器时,它闪烁了一下就立刻熄灭了,屏幕上一片漆黑。

我们需要读取这个“黑匣子”在死前留下的最后信息。据信,通往下一层的密钥就藏在系统的标准输出 (Standard Output) 中。

🎯 任务目标

  1. 运行 Level 1 镜像。
  2. 找出容器启动失败前的日志信息。
  3. 获取 Level 2 的 Tag。

💻 操作指令

首先,尝试启动目标容器:

docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level1

(你会发现什么都没发生,容器似乎直接退出了... 这正是问题所在。)

🕵️‍♂️ 提示 (Hints):

容器虽然停止运行了(Exited),但它并不是“消失”了。它只是变成了一具“尸体”。

Docker 会忠实地记录下容器生前说过的每一句话。

你需要用到 docker logs 命令。如果你不知道怎么用,试着查询 docker logs --help。

📝 提交校验: 当你找到类似 FLAG{...} 的字符串后,请将其作为 Tag 拼接到镜像名后,尝试拉取

“提示:如果日志也被‘抹除’了,说明里面混入了某种能够欺骗终端的控制信号。尝试使用管道符 (|) 配合 grep 命令来提取关键信息,或者将日志导出到文件分析。”


🔓 Level 2: 被封锁的气闸 (The Sealed Airlock)

前置需求:你必须拥有 Level 1 的 Flag 才能解锁此关卡。 当前状态:气闸控制台已上线,但物理连接被切断。

📍 场景描述: 我们成功从 Level 1 的黑匣子中恢复了系统访问权。现在,你需要进入 “气闸控制模块” 手动开启通道。

控制台运行在一个 Web 服务器上。但是,当你尝试连接时,你会发现它拒绝了所有的外部请求。防火墙图纸(Dockerfile)上标注端口是 80,但这可能是一个诱饵。

🎯 任务目标

  1. 启动 Level 2 容器。
  2. 找到 Web 服务真正监听的内部端口
  3. 利用 端口映射 (Port Mapping) 将其暴露到你的宿主机(比如 localhost:8000)。
  4. 用浏览器访问网页,获取下一关的 Flag。

💻 操作指令

首先,拉取并启动镜像:

docker run -d docker.cnb.cool/opencamp/learning-docker/project-moby:level2-[level1找到的Flag]

(注意:这次我们使用了 -d 让它在后台运行,因为这是一个 Web 服务)


👻 Level 3: 核心舱的幽灵 (The Ghost in the Shell)

前置需求:你必须拥有 Level 2 的 Flag。 当前状态:核心舱物理连接已恢复,但管理界面丢失。

📍 场景描述: 你成功启动了核心舱(Level 3),但所有的控制端口都被系统安全协议锁死了。你无法通过 Web 或日志获取任何有效信息。

扫描显示,密钥被物理写入了容器内部的一个硬盘扇区中。但我忘记了。

🎯 任务目标

  1. 启动 Level 3 容器(让它在后台运行)。
  2. 进入目标目录,找到隐藏的密钥文件。

💻 操作指令

启动目标容器:

docker run -d docker.cnb.cool/opencamp/learning-docker/project-moby:level3-[level2找到的Flag]

🔋 Level 4: 遗失的密钥 (The Missing Key)

前置需求:你必须拥有 Level 3 的 Flag。 当前状态:动力反应堆处于离线状态,启动程序报错。

📍 场景描述: 核心舱已修复,但整个空间站的能源系统(Reactor)依然没有响应。 启动日志显示,反应堆控制程序因为缺少“授权密钥”而拒绝启动。这是为了防止未授权操作而设计的安全机制。

我们需要你手动注入这个密钥,强制启动反应堆。

🎯 任务目标

  1. 启动 Level 4 容器(让它在后台运行)。
  2. 找到并注入密钥文件。

💻 操作指令

第一步:试错 运行容器,看看它报什么错:

docker run -d docker.cnb.cool/opencamp/learning-docker/project-moby:level4-[level3找到的Flag]

🕵️‍♂️ 知识点: 在 Docker 中,环境变量是配置应用程序最常用的方式(例如配置数据库密码 MYSQL_ROOT_PASSWORD)。如果忘记传递这些变量,容器通常会直接退出。


📦 Level 5: 断裂的数据链路 (The Broken Data Link)

前置需求:你必须拥有 Level 4 的 Flag。 当前状态:量子解码器已就绪,但配置文件丢失。

📍 场景描述: 反应堆已经重新上线,但我们发现量子解码器(Quantum Decoder)无法启动。系统日志显示,解码器需要读取一个配置文件,但容器内部根本不存在这个文件!

配置文件实际上存储在宿主机上。我们需要建立一个"数据桥梁",让容器能够访问宿主机上的文件。

🎯 任务目标

  1. 运行容器,分析错误信息,找出需要的配置文件路径和密钥。
  2. 在宿主机上创建配置文件,写入正确的密钥。
  3. 使用 数据卷挂载 (Volume Mount) 将宿主机目录映射到容器内部。
  4. 成功启动解码器,获取下一关的 Flag。

💻 操作指令

第一步:试错 先直接运行容器,观察错误信息:

docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level5-[level4找到的Flag]

(仔细阅读错误提示,它会告诉你需要什么)

🕵️‍♂️ 提示

  • 错误信息会告诉你配置文件应该放在容器的哪个路径
  • 错误信息还会提示你配置文件中需要写入什么内容
  • 使用 -v [宿主机路径]:[容器路径] 可以将宿主机的目录"映射"到容器内部
  • 数据卷是 Docker 中实现数据持久化数据共享的核心机制

🌐 Level 6: 孤岛求援 (The Isolated Islands)

前置需求:你必须拥有 Level 5 的 Flag。 当前状态:通讯系统分裂为两个孤立节点,无法互联。

📍 场景描述: 空间站的通讯系统由两个模块组成:

  • Vault(金库):存储着最终密钥的安全服务器
  • Client(客户端):用于请求密钥的终端程序

问题是:这两个模块被隔离在不同的"网络孤岛"上,彼此无法通信。Client 尝试连接 Vault,但连接失败了。

你需要想办法让这两个容器能够互相通信。

🎯 任务目标

  1. 分析 Client 的错误信息,理解问题所在。
  2. 找到让两个容器互相通信的方法。
  3. 正确启动 Vault 和 Client,获取最终 Flag。

💻 操作指令

第一步:试错 先直接运行 Client,观察错误信息:

docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level6-[level5找到的Flag]

(错误信息会给你重要的线索)

第二步:拉取 Vault 镜像

docker pull docker.cnb.cool/opencamp/learning-docker/project-moby:level6-vault

(注意:Vault 镜像的 tag 是固定的 level6-vault,不需要 Flag)

🕵️‍♂️ 提示

  • 默认情况下,容器使用 bridge 网络,彼此之间无法通过容器名称互相访问
  • 查阅 docker network --help 了解如何创建和管理网络
  • 容器可以通过 --network 参数加入指定网络
  • 容器可以通过 --name 参数指定名称
  • 在同一个自定义网络中,容器可以通过名称互相发现

🏆 Level 7: 终极试炼 - 臃肿的核心 (The Bloated Core) [BOSS]

前置需求:你必须拥有 Level 6 的 Flag。 当前状态:核心系统镜像严重膨胀,无法正常部署。

📍 场景描述: 恭喜你,特工!你已经成功修复了空间站的所有子系统。现在,只剩下最后一步:重启核心系统

但是,我们遇到了一个严重的问题:核心系统的 Docker 镜像体积超过了 1GB!这个臃肿的镜像是由一个粗心的前任工程师留下的"技术债务"。

你的最终任务是:优化 Dockerfile,将镜像体积压缩到 50MB 以下

🎯 任务目标

  1. 拉取并分析臃肿的核心镜像。
  2. 运行镜像,阅读系统给出的优化提示。
  3. 创建一个优化后的 Dockerfile
  4. 构建优化后的镜像,确保体积小于 50MB。
  5. 运行优化后的镜像,获取最终 Flag。

💻 操作指令

第一步:拉取臃肿镜像并查看大小

docker pull docker.cnb.cool/opencamp/learning-docker/project-moby:level7-[level6找到的Flag] docker images | grep level7

第二步:运行镜像,查看提示

docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level7-[level6找到的Flag]

(系统会告诉你优化的方向和技巧)

第三步:获取源代码 你需要从镜像中提取 core_system.c 源代码文件,然后自己编写优化的 Dockerfile。

🕵️‍♂️ 提示

  • 可以使用 docker cp 从容器中复制文件
  • 或者使用 docker exec 进入容器查看文件内容
  • 多阶段构建 (Multi-stage Build):在一个 Dockerfile 中使用多个 FROM,将构建环境和运行环境分离
  • Alpine 镜像:超轻量级 Linux 发行版,仅 ~5MB,适合作为生产镜像的基础
  • 静态编译:使用 gcc -static 生成不依赖动态库的独立可执行文件

第四步:验证并获取 Flag 构建你的优化镜像,确认大小小于 50MB,然后运行它。系统会验证镜像大小并给出 Flag。


🎊 任务完成!

恭喜你,特工!你已经成功完成了所有 7 个关卡的挑战!

通过这次任务,你掌握了以下 Docker 核心技能:

关卡技能点
Level 1docker logs - 日志分析与调试
Level 2docker run -p - 端口映射与网络暴露
Level 3docker exec - 进入容器内部执行命令
Level 4docker run -e - 环境变量注入
Level 5docker run -v - 数据卷挂载与持久化
Level 6docker network - 容器网络与服务发现
Level 7Multi-stage Build - 镜像优化与最佳实践

"The whale has awakened. Welcome aboard, Agent." "巨鲸已苏醒。欢迎登船,特工。"


📚 延伸阅读

任务完成

--- MOBY CORE SYSTEM v7.0 --- Performing final system diagnostics... Detected image size: 7 MB [SYSTEM ONLINE] Optimization successful! Image size: 7 MB - Well under the 50MB limit! ================================================ CONGRATULATIONS, AGENT! You have completed all 7 levels! FLAG{MASTER_OF_CONTAINERS} ================================================ You have proven your mastery of Docker: - Level 1: Logs Analysis - Level 2: Port Mapping - Level 3: Container Exec - Level 4: Environment Variables - Level 5: Volume Mounting - Level 6: Container Networking - Level 7: Image Optimization Welcome to the world of containerization!