警告:系统核心已离线。全区进入紧急维护状态。 身份确认:DevOps 特勤组 - [学员姓名] 当前状态:等待指令...
我们的主控 AI "Moby" 遭遇不明故障,所有的服务容器(Containers)都已陷入瘫痪、死锁或损坏状态。整个开发环境目前处于静默隔离模式。
你被紧急唤醒。作为唯一的系统维护员,你需要通过终端(Terminal),逐一修复这些"坏掉"的舱室。
你的目标很简单:利用 Docker 技能,找到每一个关卡中隐藏的 Flag。
FLAG{...} 形式的字符串。FLAG{secret},那么 Level 2 的拉取命令就是 docker pull [你的DockerID]/project-moby:level2-secret。📍 场景描述: 控制台显示"生命维持系统"启动失败。当我们尝试启动这个容器时,它闪烁了一下就立刻熄灭了,屏幕上一片漆黑。
我们需要读取这个"黑匣子"在死前留下的最后信息。据信,通往下一层的密钥就藏在系统的标准输出 (Standard Output) 中。
🎯 任务目标:
💻 操作指令:
首先,尝试启动目标容器:
docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level1
(你会发现什么都没发生,容器似乎直接退出了... 这正是问题所在。)
🕵️♂️ 提示 (Hints):
容器虽然停止运行了(Exited),但它并不是"消失"了。它只是变成了一具"尸体"。
Docker 会忠实地记录下容器生前说过的每一句话。
你需要用到 docker logs 命令。如果你不知道怎么用,试着查询 docker logs --help。
📝 提交校验: 当你找到类似 FLAG{...} 的字符串后,请将其作为 Tag 拼接到镜像名后,尝试拉取
"提示:如果日志也被'抹除'了,说明里面混入了某种能够欺骗终端的控制信号。尝试使用管道符 (|) 配合 grep 命令来提取关键信息,或者将日志导出到文件分析。"
前置需求:你必须拥有 Level 1 的 Flag 才能解锁此关卡。 当前状态:气闸控制台已上线,但物理连接被切断。
📍 场景描述: 我们成功从 Level 1 的黑匣子中恢复了系统访问权。现在,你需要进入 "气闸控制模块" 手动开启通道。
控制台运行在一个 Web 服务器上。但是,当你尝试连接时,你会发现它拒绝了所有的外部请求。防火墙图纸(Dockerfile)上标注端口是 80,但这可能是一个诱饵。
🎯 任务目标:
💻 操作指令:
首先,拉取并启动镜像:
docker run -d docker.cnb.cool/opencamp/learning-docker/project-moby:level2-[level1找到的Flag]
(注意:这次我们使用了 -d 让它在后台运行,因为这是一个 Web 服务)
PORTS_ARE_GATES
前置需求:你必须拥有 Level 2 的 Flag。 当前状态:核心舱物理连接已恢复,但管理界面丢失。
📍 场景描述: 你成功启动了核心舱(Level 3),但所有的控制端口都被系统安全协议锁死了。你无法通过 Web 或日志获取任何有效信息。
扫描显示,密钥被物理写入了容器内部的一个硬盘扇区中。但我忘记了。
🎯 任务目标:
💻 操作指令:
启动目标容器:
docker run -d docker.cnb.cool/opencamp/learning-docker/project-moby:level3-[level2找到的Flag]
前置需求:你必须拥有 Level 3 的 Flag。 当前状态:动力反应堆处于离线状态,启动程序报错。
📍 场景描述: 核心舱已修复,但整个空间站的能源系统(Reactor)依然没有响应。 启动日志显示,反应堆控制程序因为缺少"授权密钥"而拒绝启动。这是为了防止未授权操作而设计的安全机制。
我们需要你手动注入这个密钥,强制启动反应堆。
🎯 任务目标:
💻 操作指令: EXEC_IS_YOUR_WEAPON 第一步:试错 运行容器,看看它报什么错:
docker run -d docker.cnb.cool/opencamp/learning-docker/project-moby:level4-EXEC_IS_YOUR_WEAPON
前置需求:你必须拥有 Level 4 的 Flag。 当前状态:量子解码器已就绪,但配置文件丢失。
📍 场景描述: 反应堆已经重新上线,但我们发现量子解码器(Quantum Decoder)无法启动。系统日志显示,解码器需要读取一个配置文件,但容器内部根本不存在这个文件!
配置文件实际上存储在宿主机上。我们需要建立一个"数据桥梁",让容器能够访问宿主机上的文件。
🎯 任务目标:
💻 操作指令:
第一步:试错 先直接运行容器,观察错误信息:
docker run -v ./config.txt:/data/config.txt docker.cnb.cool/opencamp/learning-docker/project-moby:level5-ENV_VARS_ARE_KEYS
(仔细阅读错误提示,它会告诉你需要什么)
🕵️♂️ 提示:
-v [宿主机路径]:[容器路径] 可以将宿主机的目录"映射"到容器内部前置需求:你必须拥有 Level 5 的 Flag。 当前状态:通讯系统分裂为两个孤立节点,无法互联。
📍 场景描述: 空间站的通讯系统由两个模块组成:
问题是:这两个模块被隔离在不同的"网络孤岛"上,彼此无法通信。Client 尝试连接 Vault,但连接失败了。
你需要想办法让这两个容器能够互相通信。
🎯 任务目标:
💻 操作指令:
第一步:试错 先直接运行 Client,观察错误信息:
docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level6-VOLUMES_BIND_WORLDS
(错误信息会给你重要的线索)
第二步:拉取 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 6 的 Flag。 当前状态:核心系统镜像严重膨胀,无法正常部署。
📍 场景描述: 恭喜你,特工!你已经成功修复了空间站的所有子系统。现在,只剩下最后一步:重启核心系统。
但是,我们遇到了一个严重的问题:核心系统的 Docker 镜像体积超过了 1GB!这个臃肿的镜像是由一个粗心的前任工程师留下的"技术债务"。
你的最终任务是:优化 Dockerfile,将镜像体积压缩到 50MB 以下。
🎯 任务目标:
Dockerfile。💻 操作指令:
第一步:拉取臃肿镜像并查看大小
docker pull docker.cnb.cool/opencamp/learning-docker/project-moby:level7-NETWORKS_CONNECT_ALL docker images | grep level7
第二步:运行镜像,查看提示
docker run docker.cnb.cool/opencamp/learning-docker/project-moby:level7-NETWORKS_CONNECT_ALL
(系统会告诉你优化的方向和技巧)
第三步:获取源代码
你需要从镜像中提取 core_system.c 源代码文件,然后自己编写优化的 Dockerfile。
🕵️♂️ 提示:
docker cp 从容器中复制文件docker exec 进入容器查看文件内容FROM,将构建环境和运行环境分离gcc -static 生成不依赖动态库的独立可执行文件第四步:验证并获取 Flag 构建你的优化镜像,确认大小小于 50MB,然后运行它。系统会验证镜像大小并给出 Flag。
前置需求:你必须拥有 Level 7 的 Flag。 当前状态:完成 Level 7,提交你的优化成果。
📍 场景描述: 恭喜你完成了核心系统的优化!现在,你需要将你的 Dockerfile 提交给中央指挥部进行审核。
🎯 任务目标:
💻 操作指令:
第一步:创建提交目录
mkdir -p submissions/YOUR_USERNAME/level7
第二步:复制你的 Dockerfile
cp level7/Dockerfile submissions/YOUR_USERNAME/level7/
第三步:创建 completion.json
参考 submissions/.template/ 目录下的模板,创建你的完成记录。
第四步:本地验证
./level8/validate.sh YOUR_USERNAME
第五步:提交 PR 将你的修改提交并创建 Pull Request,审核通过后即可获得通关证书!
前置需求:完成 Level 8 的提交。 当前状态:终极挑战,猎取最后的 Flag!
📍 场景描述: 这是最后的考验!你需要在一个神秘的容器中寻找散落各处的 Flag 片段,并将它们组合成完整的 Flag。
🎯 任务目标:
💻 操作指令:
第一步:拉取 Level 9 镜像
docker pull docker.cnb.cool/2026jingyu/project-moby:level9
第二步:启动容器
docker run -d --name level9 docker.cnb.cool/2026jingyu/project-moby:level9
第三步:查看挑战提示
docker logs level9
第四步:寻找 Flag 片段 尝试以下命令来寻找片段:
# 检查环境变量
docker exec level9 env | grep FLAG
# 查找隐藏文件
docker exec level9 find /tmp -name ".fragment*"
# 检查容器文件系统变化
docker diff level9
# 进入容器探索
docker exec -it level9 sh
第五步:组合片段 将找到的所有片段按正确顺序组合,得到完整的 Flag。
🕵️♂️ 提示:
/tmp) 经常存放临时文件docker diff 可以查看容器启动后文件系统的变化恭喜你,特工!你已经成功完成了所有 9 个关卡的挑战!
通过这次任务,你掌握了以下 Docker 核心技能:
|| 关卡 | 技能点 |
||------|--------|
|| Level 1 | docker logs - 日志分析与调试 |
|| Level 2 | docker run -p - 端口映射与网络暴露 |
|| Level 3 | docker exec - 进入容器内部执行命令 |
|| Level 4 | docker run -e - 环境变量注入 |
|| Level 5 | docker run -v - 数据卷挂载与持久化 |
|| Level 6 | docker network - 容器网络与服务发现 |
|| Level 7 | Multi-stage Build - 镜像优化与最佳实践 |
|| Level 8 | Git & PR - 项目协作与提交 |
|| Level 9 | 综合运用 - Docker 命令综合实战 |
"The whale has awakened. Welcome aboard, Agent." "巨鲸已苏醒。欢迎登船,特工。"