KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
课程导读 · Docker 应用课 — keel 龙骨
Docker 应用课:把容器用对 的参考信息:课程导读 · Docker 应用课
从「会敲命令」到「能预判这份配置在别人机器上会怎么坏」
你现在的起点
先花两分钟对一下。如果你对下面四条的答案都是"是",可以直接跳到章节地图:
- 你能说清
docker build .那个.是发给谁的、发了什么; - 你改过 Dockerfile 的指令顺序,并且知道改动会影响构建时间的哪一段;
- 你知道
CMD ["node","a.js"]和CMD node a.js除了写法,行为上差在哪; - 你的
compose.yml里depends_on用的是带condition的写法,而不是裸列表。
只要有一条不确定,这门课的对应章节就是为你写的。特别提醒第 3 条:它看起来是纯语法问题,实际决定了容器停止时你的优雅退出逻辑有没有机会执行——很多人排查过这个 bug,但没意识到根因在 CMD 的写法上。
一条能走通的学习路径
边界在哪 01 容器与构建上下文
↓
怎么被造出来 02 层、缓存与指令顺序
↓
写对一份 03 一个真能跑起来的 Dockerfile
↓
怎么编排起来 04 Compose:本地编排器
↓
东西怎么进去 05 配置与密钥跨边界
↓
怎么停下来 06 信号与优雅停机
↓
坏了怎么看 07 排障、资源限制与选型边界
01–03 是造镜像:从"上下文里有什么"到"每一层怎么排"再到"逐行写对"。04–06 是跑容器:编排、注入、停机。07 收口到"出事时你手上有什么工具"。
04 与 06 之间有依赖:06 讲的停机链路发生在 04 编排出来的服务上,如果你还没读 04,06 里的 stop_grace_period 会缺少上下文。其余章节可以按需跳读。
章节地图
| 章 | 关键问题 | 你会亲手验证什么 |
|---|---|---|
| 01 容器与构建上下文 | docker build . 的 . 是什么?为什么它决定了构建快慢与密钥安全? |
用体积统计实测同一目录在 .dockerignore 前后的上下文大小(本机实测 3337.2 KB → 1.1 KB) |
| 02 层、缓存与指令顺序 | 层的缓存按什么失效?为什么"改一行代码重装依赖"是顺序问题? | 逐行对照两个 Dockerfile,指出哪一行会让依赖层在业务代码变更时作废 |
| 03 一个真能跑起来的 Dockerfile | 多阶段怎么落地?npm ci 与 npm install 什么时候会直接让构建失败? |
真跑 npm ci,拿到缺 lockfile 时的 EUSAGE 报错与退出码 |
| 04 Compose:本地编排器 | depends_on 写了为什么还连不上?变量从哪儿来、谁优先? |
用 docker compose config 把 compose.yml 展开成实际生效配置,含变量清单与失败路径 |
| 05 配置与密钥跨边界 | 密钥是怎么被"烤进"镜像的?ARG 和 environment 差在哪? |
核对两份 .env 的内容差异,确认 compose 到底读了哪一份 |
| 06 信号与优雅停机 | 容器停止时信号发给了谁?为什么等不到应用自己退出? | 从解析结果里读出各服务的 stop_grace_period,并与 CMD 形式对照 |
| 07 排障、资源限制与选型边界 | 容器被杀但日志空白怎么查?exit 137 意味着什么? |
核对资源限制被归一化后的实际数值,并列出五条排障命令各自能看到与看不到什么 |
每章统一以 现场 → 机制推演 → 实测输出 → 生产边界 → 动手 → 故障注入 → 自测 收束。自测题要求解释因果,不要求背命令。
与相邻课程的分工
- 《构建打包与部署上线》:那边把镜像当发布产物来管(版本、供应链、部署策略、回滚)。本课第 03 章写完一个可用的多阶段 Dockerfile 之后,供应链硬化(按 digest 固定、SBOM、签名)直接读它第 02 章,本课不重写。
- 《CI 流水线与质量门禁》:本课第 03 章关心的"同一份输入产出同一份镜像",是那边流水线可重复性要求的前置条件。
- Kubernetes:本课停在单机与 Compose。K8s 把 pod、探针、声明式收敛换了一套表达,但信号、健康判断、资源限制这三件事的语义是继承的——学完 04–06,你已经有了理解探针与
terminationGracePeriodSeconds的底座。
前置要求
- 能在命令行里读懂
docker与docker compose的基本用法(run/build/up/logs),不需要熟练; - 知道 HTTP 服务是怎么启动、怎么响应一个请求的(本课的示例应用是一个几十行的 Node HTTP 服务);
- 知道环境变量是怎么回事。不需要会写 Dockerfile,也不需要 Docker 基础之外的前置。
- 容器里会用到的包管理命令(
npm ci、apt-get)不需要提前掌握,用到时会解释。
实验环境说明
课程的实测输出来自一台 Windows + Docker CLI 29.2.1 + Node 22.22.2 的机器。其中:
docker compose系列命令用的是纯客户端解析(不需要 daemon 运行),所以config、--variables、--services的输出是真实可复现的;- 涉及容器内运行时的现象(PID 1 收信号、OOMKill、
exit 137)本机没有实测,正文按官方文档与逐行走读写成,并逐处标注; - Linux 上的绝对数值会不同。请读输出的形状(哪个字段被归一化成什么、哪个变量被判为必填),不要抄任何具体数字当阈值。