课程目录

第 2 周 · 初阶

第2周:操作系统与虚拟化

掌握OS核心,进入容器世界

周目标:掌握OS核心概念、Linux实操、虚拟化与容器化技术

课程成果:CO1 CO8

已学习 0 / 7 天

本周 7 个学习日

Day 8

操作系统原理

建议时长:60 分钟

本日 CO:CO1 CO8

本日概要

从一次程序运行建立操作系统资源链:程序装入后成为进程,进程拥有虚拟地址空间与文件描述符表,线程共享进程资源但各自保留执行上下文;调度器让可运行任务竞争 CPU,虚拟内存通过页表提供地址转换、保护与受控共享,VFS 把不同文件系统统一到 open/read/write 等接口,阻塞与非阻塞 I/O 则决定调用者等待数据时如何继续工作。今天不把 top 中的一个高数值直接当作故障,而是结合时间窗、进程状态和证据解释现象。

听书与视频

本日听书

5 分钟 · MP3 · 双主持人讲解

B 站讲解

操作系统原理(合集)

从0开始数 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能区分程序、进程与线程,并说明资源所有权和执行上下文的差别
  • 能解释虚拟地址、页表、页缓存、匿名内存与物理内存之间的关系
  • 能沿文件描述符、VFS、页缓存与设备说明一次文件 I/O 的基本路径
  • 能用带时间戳的命令输出支持判断,而不是把单次资源快照当成因果结论

核心讲解

进程与线程是资源容器和执行流

磁盘上的程序是静态指令和数据;运行后,内核为它建立进程标识、虚拟地址空间、打开文件表和安全凭据。线程是可被调度的执行流,同一进程内的线程通常共享代码、堆和文件描述符,但各自拥有寄存器、栈与调度状态。多线程可以隐藏等待或利用多核,却也会引入竞态、锁竞争和上下文切换成本,所以线程数增加不等同于吞吐必然增加。

Linux 工具展示的是不同观察面。ps 给出采样时刻的进程或线程字段,top 连续刷新 CPU、内存和状态,/proc/<pid>/status 与 /proc/<pid>/fd 暴露内核维护的进程信息。R 表示可运行或正在运行,S 常表示可中断睡眠;CPU 高、负载高和响应慢不是同一个命题,必须记录持续时间、任务状态和并发条件再解释。

虚拟内存、文件与 I/O 组成数据路径

应用使用虚拟地址,处理器和页表把它翻译到物理页;这种抽象提供保护、按需分页和受控共享。匿名内存通常承载堆栈,文件数据读入后可进入页缓存,写入也可能先成为脏页再回写存储。因此 free 输出中的 available 比简单的 free 更接近可供新负载使用的内存,缓存占用不能一律视为泄漏,出现交换或 OOM 也应结合工作集与回收压力判断。

文件名先经 VFS 路径查找关联目录项和 inode,open 返回当前进程文件描述符表中的小整数,read/write 再通过该描述符访问打开文件对象。阻塞 I/O 在条件未满足时让调用线程等待;非阻塞、复用和异步机制改变等待组织方式,却不会让底层数据瞬间到达。分析 I/O 要同时看调用语义、队列、缓存、设备延迟和错误,而不是只记住一个“异步更快”的口号。

实践任务

在 Linux 学习环境中启动一个受控 CPU 任务,使用 ps、top、free 与 /proc 观察进程、线程、内存和文件描述符,并保存前后对照。

  • 实验边界——平台:Ubuntu/Debian/Fedora 等 Linux;权限:普通用户,仅观察本人进程;安全:不用 sudo、sysctl 或写 /proc,kill 仅作用于本步记录的 PID;清理:结束自己启动的 yes 进程并删除临时日志。
  • 运行 `yes > /dev/null & lab_pid=$!`,立即记录 PID;用 `ps -o pid,ppid,stat,%cpu,%mem,nlwp,comm -p "$lab_pid"` 和 `ps -L -p "$lab_pid"` 保存进程与线程快照。
  • 运行 `free -h`、`cat /proc/$lab_pid/status` 与 `ls -l /proc/$lab_pid/fd`,把虚拟内存、驻留集、线程数和文件描述符分别映射到今天的概念图。
  • 执行 `kill "$lab_pid"` 后用 `wait "$lab_pid" 2>/dev/null || true` 回收子进程;再次运行 ps 与 free,记录哪些指标变化、哪些不能由单次实验推出因果。

自测与答案

第 1 题

同一进程的两个线程通常共享什么,又各自保留什么?

尚未检查本题。

查看答案与评价要点

参考答案:通常共享虚拟地址空间、代码、堆和打开文件等进程资源;各自保留寄存器、栈、程序计数与调度状态。

评价要点:指出至少两类共享资源;指出独立执行上下文或栈;不把线程误写成完全隔离进程

第 2 题

为什么不能看到 free 很小就断言系统发生内存泄漏?

尚未检查本题。

查看答案与评价要点

参考答案:Linux 会用内存保存可回收页缓存,应结合 available、RSS/工作集趋势、交换与回收或 OOM 证据观察。

评价要点:说明页缓存可能可回收;引用 available 或趋势;提出至少一种补充证据

尚未完成自测。

今日完成标准

  • 提交含平台、时间、命令和前中后输出的实验记录,所有 PID 均来自本人启动的进程
  • 概念图正确连接进程、线程、虚拟内存、页缓存、文件描述符、VFS 与 I/O
  • 至少写出一条由证据支持的观察和一条当前实验不能证明的推断

常见错误与纠正提示

  • 把进程等同于程序文件,或认为同一进程内线程拥有彼此完全隔离的地址空间
  • 看到缓存占用就判断内存泄漏,忽略页缓存可回收性、时间趋势和工作负载
  • 把一次 top 快照当作性能结论,没有记录命令、时间、平台与实验边界

分层任务

基础任务

根据给定 ps 与 free 输出标注 PID、状态、线程数、RSS 和 available,并用一句话解释每项不代表什么。

标准任务

完成受控任务的前中后快照,画出进程—线程—虚拟内存—文件描述符—VFS—设备关系,并附完整命令记录。

挑战任务

再比较一个 I/O 等待任务与 CPU 任务的状态变化,提出采样频率、重复次数和混杂变量控制方案。

关联知识点

延伸阅读

学习状态:未学习

Day 9

Linux实操

建议时长:60 分钟

本日 CO:CO1 CO8

本日概要

把 Linux 运维任务拆成路径、身份、进程和日志四条线:文件系统层级说明数据放在哪里,用户/组与 rwx 权限决定谁能对目录项和文件做什么,Shell 脚本把可重复观察固化为带错误处理的步骤,systemd 单元描述服务的启动条件与生命周期,journal 则提供按单元、启动批次和时间过滤的日志。练习只读取本机状态并写入个人临时目录,不修改系统服务或全局权限。

听书与视频

本日听书

5 分钟 · MP3 · 双主持人讲解

B 站讲解

最新Linux安装+Linux安装激活教程,附安装包及激活码,Linux下载安装教程,Linux安装包,Linux虚拟机安装,Linux操作系统

Python_子瑶 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能用 /etc、/var、/run、/tmp 与个人目录的职责解释文件放置选择
  • 能根据所有者、组、其他用户与目录执行位判断最小必要权限
  • 能编写带严格模式、参数校验和引用变量的只读 Shell 监控脚本
  • 能区分 systemd 单元状态与 journal 日志证据,并记录命令失败信息

核心讲解

路径与权限共同定义访问边界

Linux 目录不是随意命名的文件夹集合:/etc 常放主机配置,/var 容纳可变数据和日志,/run 保存本次启动的运行态,/tmp 用于临时文件,普通学习产物应优先留在个人目录。文件 rwx 控制读、写、执行;目录的执行位关系到能否穿越和访问其中条目。判断权限必须同时看对象类型、所有者、所属组、其他用户以及上级目录,不能只看到 777 就认为问题解决。

最小权限意味着只授予完成任务所需的身份和操作。chmod 777、长期使用 sudo 或把用户加入高权限组会扩大攻击面;复制配置前应保留原文件并理解恢复路径。本日实验只在 mktemp 创建的个人临时目录中改变权限,通过 `stat` 和一次预期失败证明边界,既不修改 /etc,也不接触其他用户的数据。

脚本、服务状态与日志形成可复核记录

可维护 Shell 脚本应有明确解释器、`set -eu`、参数检查、变量双引号和可预测输出;采集命令失败时要保留退出状态,而非输出一份看似完整的空报告。监控报告至少写时间、主机与操作系统、运行时间/负载、可用内存和文件系统容量,并说明每项只是观察信号,不把瞬时高负载直接诊断为 CPU 故障。

systemd 管理单元的依赖和状态,`systemctl --user` 可在支持的发行版中查看当前用户服务;`journalctl --user` 读取用户可见日志。系统级日志常受组或 root 权限限制,学员不应为完成练习扩大权限。状态显示 failed 时,先记录退出码和最近日志,再检查配置、依赖和资源;不应反复 restart 掩盖第一现场。

实践任务

编写只读监控脚本,采集时间、负载、内存、磁盘与指定用户服务日志,并证明脚本在失败路径也返回明确状态。

  • 实验边界——平台:采用 systemd 的 Linux 发行版;权限:普通用户,不用 sudo;安全:只读采集且临时目录权限设为 700;清理:退出后删除 `mktemp -d` 返回的本人目录。
  • 用 `lab_dir=$(mktemp -d)`、`stat -c '%A %U %G %n' "$lab_dir"` 建立安全工作区;创建 `monitor.sh`,写入时间、`uname -sr`、`uptime`、`free -h` 与 `df -h "$HOME"` 的输出。
  • 为脚本加入 `#!/usr/bin/env bash`、`set -eu`、输出路径参数检查与双引号;执行 `bash "$lab_dir/monitor.sh" "$lab_dir/report.txt"`,保存退出码并检查报告非空。
  • 运行 `systemctl --user --no-pager --failed` 与 `journalctl --user -n 20 --no-pager`;若用户实例不可用,如实保存错误而不切换 root;最后运行 `rm -rf -- "$lab_dir"`,先核对变量非空且路径来自本步 mktemp。

自测与答案

第 1 题

为什么目录有读权限但没有执行权限时,仍可能无法读取其中已知文件?

尚未检查本题。

查看答案与评价要点

参考答案:目录执行位控制路径穿越和访问目录项;读位主要允许列出名称,二者语义不同。

评价要点:指出执行位负责路径穿越;区分列目录与访问条目;结合上级目录权限说明

第 2 题

服务显示 failed 后,为什么不应先连续 restart?

尚未检查本题。

查看答案与评价要点

参考答案:重启可能覆盖或扰动第一现场,应先记录状态、退出码、时间窗和相关 journal 日志,再基于证据定位配置、依赖或资源问题。

评价要点:强调保留第一现场;列出状态/退出码/日志证据;提出证据驱动检查顺序

尚未完成自测。

今日完成标准

  • 脚本可由普通用户在临时目录重复运行,成功和失败路径都有退出码且变量引用安全
  • 报告包含平台、时间、命令、负载、内存、磁盘和用户级服务/日志证据
  • 清理记录证明只删除本人实验目录,未修改系统服务、/etc 或全局权限

常见错误与纠正提示

  • 为绕过权限错误直接 chmod 777 或 sudo 执行未知脚本,没有确认对象和恢复方法
  • Shell 变量不加双引号,文件名含空格或通配字符时处理了错误目标
  • 只抄 systemctl 的 active/failed 标签,不保留 journal 时间窗、退出码和失败上下文

分层任务

基础任务

解释一组 `ls -ld` 输出中所有者、组和目录执行位,并运行教师提供的只读采集脚本。

标准任务

独立完成带严格模式和错误记录的监控脚本,附脚本、运行命令、退出码、报告样例与清理证据。

挑战任务

加入参数化采样次数与间隔、文件锁或原子写入,并解释如何避免并发运行互相覆盖报告。

关联知识点

延伸阅读

学习状态:未学习

Day 10

Linux网络与调试

建议时长:65 分钟

本日 CO:CO1 CO8

本日概要

用分层和时间线排查“服务访问失败”:先确认进程是否存在及监听地址,再确认本机连接、名称解析与路由,然后查看应用/系统日志,最后用 strace 在授权进程上观察系统调用。ss 展示套接字,ip 展示地址与路由,journalctl 关联日志,strace 揭示应用和内核接口;每个工具只回答一类问题。防火墙是潜在环节,但本日不改 iptables/firewalld 规则,以免中断主机或远程连接。

听书与视频

本日听书

5 分钟 · MP3 · 双主持人讲解

B 站讲解

什么是Netplan,Ubuntu手工配置网络教程

热爱IT行业 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能按进程—监听—名称/路由—连接—日志顺序缩小网络故障范围
  • 能解释 127.0.0.1 与 0.0.0.0 监听边界以及 TCP 连接状态的含义
  • 能在授权范围内使用 ss、curl、journalctl 和 strace 留存排障证据
  • 能把观察、假设、验证动作和结论分栏,避免凭单个错误码猜测

核心讲解

先证明服务在哪里监听

“端口不通”可能来自进程未启动、只绑定回环地址、连接目标或端口错误、名称解析异常、路由不可达、防火墙丢弃或应用返回错误。排查从最靠近服务的事实开始:确认 PID,再用 `ss -ltnp` 查看本机监听地址和端口。127.0.0.1 只接受本机回环访问,0.0.0.0 表示所有 IPv4 本地地址,但仍不代表外部网络、防火墙和上游路径必然可达。

客户端证据要区分 DNS、建连和 HTTP 层。`curl -v` 能显示解析、连接与响应阶段,`ip route get` 能查看内核为目标选择的路由;连接被拒通常提示目标主机可达但端口无监听或被主动拒绝,超时则可能涉及丢包或路径。以上只是诊断线索而非绝对结论,应与服务端监听和日志在同一时间窗交叉验证。

日志与系统调用连接应用和内核

日志说明应用认为什么发生了,系统调用跟踪说明进程向内核请求了什么以及返回值如何。strace 可看到 openat、connect、bind、read、write 等调用,但输出可能包含路径、参数和数据,也会增加运行开销;只能跟踪本人启动或明确授权的实验进程,提交前必须脱敏。先用过滤项限制调用集合和时间,再根据 errno 回到文件、网络或权限假设。

修改防火墙前必须有变更窗口、当前规则备份、带外访问和回滚方法,因为一条错误规则即可切断 SSH。本实验通过错误端口模拟失败,不执行 iptables、nft 或 firewall-cmd 写操作。学校式排障记录应包含平台、时间线、预期、每条命令及退出码、关键输出、下一步假设和清理证据,使另一个人能复现推理而不是只看到最终答案。

实践任务

启动仅绑定 127.0.0.1 的临时 HTTP 服务,制造错误端口,从监听、连接、日志和系统调用四层定位并清理。

  • 实验边界——平台:Linux,需 Python 3、ss、curl,可选 strace;权限:普通用户且仅跟踪本人进程;安全:只绑定 127.0.0.1,不扫描外网、不改防火墙;清理:终止临时服务并删除日志。
  • 运行 `python3 -m http.server 8765 --bind 127.0.0.1 >week2-http.log 2>&1 & server_pid=$!`,用 `ss -ltnp | grep 8765` 证明监听地址,并记录 PID 与时间。
  • 先执行 `curl -v --max-time 3 http://127.0.0.1:8766/` 制造错误端口,再访问 8765;对比退出码、ss 输出和 `ip route get 127.0.0.1`,写出假设如何被排除。
  • 若安装 strace,运行 `strace -f -e trace=network -p "$server_pid" -o week2-strace.log` 并发起一次请求后停止跟踪;执行 `kill "$server_pid"`、`wait "$server_pid" 2>/dev/null || true`,脱敏后删除两份日志。

自测与答案

第 1 题

`ss` 显示服务只监听 127.0.0.1:8765,可以推出什么,不能推出什么?

尚未检查本题。

查看答案与评价要点

参考答案:可推出本机回环地址存在监听;不能推出其他主机可访问,也不能证明防火墙、路由或应用响应正确。

评价要点:指出回环范围;区分监听与端到端可达;列出至少一个仍需验证的环节

第 2 题

strace 看到 connect 返回 ECONNREFUSED 时,下一步应保留哪些交叉证据?

尚未检查本题。

查看答案与评价要点

参考答案:保留目标地址/端口、时间和退出码,并在服务端核对 PID、ss 监听及同时间窗日志,确认是目标错误还是确无监听。

评价要点:记录调用参数与 errno;核对服务端监听;关联时间窗日志

尚未完成自测。

今日完成标准

  • 排障记录按进程、监听、连接、日志、系统调用分层,至少包含一组失败/成功对照
  • 全部命令标明平台与权限,未改防火墙且未访问未授权目标
  • 临时服务已终止、敏感输出已脱敏、实验日志按清单处理

常见错误与纠正提示

  • 看到 0.0.0.0 监听就宣布公网可达,忽略地址、路由、防火墙和上游网络
  • 未保存监听与日志证据就修改 iptables/firewalld,既扩大故障又失去第一现场
  • 对不属于自己的进程使用 strace,或提交包含令牌、路径和业务数据的原始跟踪

分层任务

基础任务

根据教师给出的 ss、curl 和日志片段,按监听、连接、应用三层排序并指出缺失证据。

标准任务

完成错误端口与正确端口对照实验,提交命令、退出码、时间线、分层判断和清理记录。

挑战任务

再设计一个名称解析或绑定地址故障,但仍限定在本机授权环境,比较不同故障的可观察信号。

关联知识点

延伸阅读

学习状态:未学习

Day 11

虚拟化技术

建议时长:65 分钟

本日 CO:CO1 CO8

本日概要

虚拟机以虚拟 CPU、内存、块设备和网络设备提供接近完整计算机的边界,来宾运行自己的内核。Type 1/Type 2 是理解部署位置的教学分类,不能替代对实际数据路径和权限的分析。Linux KVM 提供内核虚拟化接口,QEMU 提供机器与设备模型并可结合硬件加速;qcow2 支持稀疏分配与写时复制,但快照不是独立备份。今天先核验主机能力,再对学习者自有磁盘镜像做创建、检查和清理。

听书与视频

本日听书

5 分钟 · MP3 · 双主持人讲解

B 站讲解

云计算&虚拟化-kvm介绍&安装

运维小路 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能区分虚拟机来宾内核、VMM/Hypervisor、主机内核与硬件职责
  • 能解释 KVM 与 QEMU 的协作关系以及硬件加速不可用时的影响
  • 能区分快照、克隆和备份,说明写时复制链对恢复与删除顺序的约束
  • 能记录 CPU、内存、磁盘、网络和时间条件,形成可复核 VM 实验边界

核心讲解

虚拟机边界来自硬件接口的虚拟化

虚拟机看到 vCPU、来宾物理内存、虚拟磁盘和虚拟网卡,并在其上启动独立内核;VMM 将敏感操作、内存映射和设备访问协调到主机资源。KVM 暴露 `/dev/kvm` 和 ioctl 接口创建 VM/vCPU,QEMU 可提供系统仿真与设备模型,二者常组合使用。KVM 不可用时,QEMU 可能退回软件模拟,功能仍可能运行但性能口径完全不同。

Type 1 常指直接运行于硬件或宿主内核层的 Hypervisor,Type 2 常指作为宿主操作系统应用运行的方案;现实产品可能跨越简化分类。选型应检查来宾隔离、设备模型、驱动、管理面、性能和运维边界,而不是凭类别标签断言更安全或更快。虚拟机管理权限等同于对来宾磁盘、内存与网络的高权限,应使用专用实验资源。

磁盘镜像和快照必须连同依赖解释

qcow2 等格式可以稀疏分配:逻辑容量大于当前宿主实际占用,因此 `qemu-img info` 与 `du` 回答不同问题。写时复制快照让新写入进入增量层,回退速度可能很快,但它依赖原镜像链;误删基础镜像、宿主盘损坏或恶意加密仍会破坏恢复能力。快照用于短期回退,独立备份还需要不同故障域和恢复演练。

比较 VM 时要先固定 vCPU、内存、镜像、来宾版本、磁盘缓存/总线、网络模式和预热时间。只比较启动耗时会忽略隔离和运维收益,只比较一个微基准也不能外推所有业务。可靠记录包含主机是否支持 KVM、实际加速器、QEMU 版本、镜像校验值、命令退出码,以及快照前写入、回退后验证和资源清理证据。

实践任务

检查 /dev/kvm 与 QEMU 能力,创建小型 qcow2 实验盘,记录稀疏文件证据并设计虚拟机快照恢复验证。

  • 实验边界——平台:x86_64 Linux 主机,安装 qemu-img;本步骤的 `qemu-system-x86_64` 探针不适用于 AArch64/ARM 主机,其他架构应改用对应的 QEMU system binary 并在记录中注明;权限:普通用户读取 /dev/kvm 权限并只操作本人目录;安全:不用系统 VM 或未知镜像;清理:仅删除本次创建的 qcow2 文件和临时目录。
  • 在 x86_64 Linux 上运行 `uname -m`、`test -e /dev/kvm && ls -l /dev/kvm || printf 'KVM device unavailable\n'`、`qemu-system-x86_64 --version`(若已安装)与 `qemu-img --version`;若 `uname -m` 不是 x86_64,停止这条探针并选择与主机/来宾架构相符的 QEMU binary,如实记录不可用项,不用 sudo 改设备权限。
  • 用 `lab_dir=$(mktemp -d)` 和 `qemu-img create -f qcow2 "$lab_dir/week2.qcow2" 2G` 创建实验盘;比较 `qemu-img info "$lab_dir/week2.qcow2"`、`ls -lh` 与 `du -h` 的逻辑/实际占用。
  • 画出基础镜像—快照/增量—来宾写入关系和恢复检查表;确认 `lab_dir` 是本步创建且只含实验盘后执行 `rm -rf -- "$lab_dir"`,保存清理前后的目录证据。

自测与答案

第 1 题

在常见 Linux 虚拟化栈中,KVM 与 QEMU 各自承担什么角色?

尚未检查本题。

查看答案与评价要点

参考答案:KVM 提供内核虚拟化接口和硬件加速能力,QEMU 提供机器/设备模型并驱动来宾运行;具体配置需核验实际加速器。

评价要点:说明 KVM 内核接口;说明 QEMU 设备或系统模型;提到实际加速条件

第 2 题

为什么 qcow2 快照不能直接等同于备份?

尚未检查本题。

查看答案与评价要点

参考答案:快照常依赖基础镜像与同一宿主故障域,无法独立抵御底层损坏或误删;备份还需独立副本与恢复验证。

评价要点:指出依赖链;指出共享故障域;要求独立副本和恢复演练

尚未完成自测。

今日完成标准

  • 层次图准确区分主机、KVM、QEMU、虚拟设备、来宾内核和应用
  • 实验记录含版本、/dev/kvm 结果、镜像格式、逻辑/实际占用及命令退出状态
  • 能够说明快照限制并证明只清理本人创建的实验镜像

常见错误与纠正提示

  • 把 KVM、QEMU 和虚拟机当作同一层组件,无法说明内核接口与设备模型职责
  • 把快照称为备份,忽略基础镜像链、宿主故障域和恢复演练
  • 为访问 /dev/kvm 随意 chmod 或 sudo,扩大主机虚拟化管理权限

分层任务

基础任务

标注一张主机硬件—KVM—QEMU—来宾内核—应用层次图,并解释每层一个职责。

标准任务

完成能力检查和 qcow2 稀疏盘实验,提交版本、命令、输出、依赖图和安全清理记录。

挑战任务

在授权实验机启动最小来宾,设计一致性快照前后的写入/回退验证,并讨论应用一致性限制。

关联知识点

延伸阅读

学习状态:未学习

Day 12

容器基础

建议时长:75 分钟

本日 CO:CO1 CO8

本日概要

容器把一个或多个进程放进 Linux 命名空间(namespaces)、cgroups 和文件系统层所形成的受限视图中,仍与主机共享内核;镜像是不可变内容与配置的分层制品,容器是在其上增加可写层的运行实例,仓库存储和分发镜像。Dockerfile 描述构建步骤,但可复现性还取决于固定基础镜像标识、构建上下文、依赖和架构。Docker daemon 或 docker 组通常拥有高权限,练习使用 Docker Desktop 或 rootless 环境并限制端口、挂载与清理目标。

听书与视频

本日听书

5 分钟 · MP3 · 双主持人讲解

B 站讲解

10分钟带你搞懂什么是Docker

Linux情报站 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能区分镜像、容器、仓库、Dockerfile 与构建上下文的职责
  • 能解释容器共享主机内核以及 namespaces/cgroups 提供的隔离边界
  • 能构建、运行、检查并精确清理一个仅绑定回环地址的容器
  • 能记录镜像 ID/digest、平台、命令和限制,避免把能运行等同于安全或可复现

核心讲解

镜像是制品,容器是受限进程

镜像由只读层和运行配置组成,Dockerfile 的 FROM、COPY、RUN、USER、CMD 等指令构成构建过程;容器启动后增加可写层并创建进程。删除容器不会自动删除镜像,删除镜像也不应被当作删除外部卷。构建上下文中的文件可能被发送给构建器,因而需要 `.dockerignore` 排除密钥、版本库和大文件,不能把凭据写进镜像层。

Linux 容器通常共享主机内核,PID、mount、network、user 等 namespace 提供视图隔离,cgroups 控制和统计资源;这些机制降低耦合却不是虚拟机那样的独立来宾内核。特权容器、宿主 socket、宽泛 bind mount 或 root 身份会显著削弱边界。比较隔离时必须具体到内核、进程、文件、网络、设备和管理权限。

可复现构建需要输入和结果都有身份

仅写 `FROM nginx:alpine` 不能保证未来得到同一内容,因为标签可以指向新镜像;严格复现应保存解析到的 digest、目标 CPU 架构和构建器版本,并对应用文件做校验。缓存能加速构建,但也可能隐藏输入变化,所以实验报告要注明是否使用缓存。镜像层历史是审计线索,不应包含令牌、密码或私钥。

运行时把服务绑定到 `127.0.0.1` 的随机宿主端口,避免端口冲突和无意暴露到局域网;容器名与镜像标签由本次临时目录生成的 `lab_token` 构造,并加 `aiknow.exercise` 归属标签。清理不能只相信可猜测的名字:必须同时核对创建成功后保存的对象 ID 与归属标签。`docker inspect` 可查看配置和状态,宿主 `ps` 证明容器仍是主机上的进程。Docker 管理接口能力很高,学员只对自己的容器和镜像操作,不用 `docker system prune` 这类全局清理。

实践任务

构建只含静态页面的 Nginx 镜像,运行到回环端口,检查镜像层、容器进程与挂载后完成精确清理。

  • 实验边界——平台:Linux rootless Docker 或 macOS/Windows Docker Desktop;权限:当前用户的 Docker 权限,不用特权容器;安全:只绑定 127.0.0.1 且不挂载敏感目录;清理:只删除同时匹配本次记录 ID 与 `aiknow.exercise` 归属标签的对象,禁用全局 prune。
  • 在 `lab_dir=$(mktemp -d)` 工作区创建 `index.html`、`.dockerignore` 与 Dockerfile,再令 `lab_token=$(basename "$lab_dir" | tr -cd '[:alnum:]' | tr '[:upper:]' '[:lower:]')`、`image_ref="aiknow-week2-static:lab-$lab_token"`、`container_name="aiknow-week2-static-$lab_token"`;使用官方 nginx:alpine 基础镜像并记录 `docker version` 与基础镜像解析结果。
  • 先分别用 `docker image inspect "$image_ref"` 与 `docker container inspect "$container_name"` 做碰撞检查:任一对象已存在就报告“创建失败:名称已被占用”并停止,绝不清理既有资源。检查通过后执行 `docker build --label "aiknow.exercise=$lab_token" -t "$image_ref" .`,成功后保存 `image_id=$(docker image inspect --format '{{.Id}}' "$image_ref")`;再执行 `container_id=$(docker run -d --label "aiknow.exercise=$lab_token" --name "$container_name" -p 127.0.0.1::80 --read-only --tmpfs /var/cache/nginx --tmpfs /var/run "$image_ref")`,用 `docker port "$container_id" 80`、curl 和 inspect 保存证据。只有命令成功且变量非空才登记为本练习所创建;创建失败不得触发对同名既有对象的删除。
  • 清理前分别核对当前容器/镜像的完整 ID 等于记录的 `container_id`/`image_id`;再运行 `docker container inspect --format '{{ index .Config.Labels "aiknow.exercise" }}' "$container_id"` 和 `docker image inspect --format '{{ index .Config.Labels "aiknow.exercise" }}' "$image_ref"`,两项都必须返回 `lab_token`。任一对象参数、ID 或归属标签不匹配就停止并报告,不删除。全部通过后才按记录 ID 执行 `docker rm -f "$container_id"`,再按本次唯一标签执行 `docker image rm "$image_ref"`;确认对象消失后删除本次 `lab_dir`,不删除基础镜像或他人资源。

自测与答案

第 1 题

镜像和容器的核心区别是什么?

尚未检查本题。

查看答案与评价要点

参考答案:镜像是可分发的只读分层制品与配置;容器是基于镜像创建、带可写层和运行进程的实例。

评价要点:指出镜像不可变制品;指出容器运行进程;提到可写层或实例关系

第 2 题

为什么加入 docker 组或访问 Docker daemon 需要按高权限管理面看待?

尚未检查本题。

查看答案与评价要点

参考答案:Docker API 可创建高权限容器、挂载宿主路径或控制主机资源,误用可能突破预期隔离,因此需最小授权和精确操作。

评价要点:指出 daemon 可控制主机资源;举出挂载或特权风险;提出最小权限

尚未完成自测。

今日完成标准

  • 静态镜像可在指定平台构建,容器只绑定回环地址且 curl 返回预期页面
  • 记录包含 Docker 版本、Dockerfile、基础镜像身份、镜像/容器 ID 和隔离限制
  • 清理记录证明容器/镜像 ID 与归属标签均匹配本次 lab_token;碰撞或创建失败时没有删除既有资源,也没有执行全局 prune

常见错误与纠正提示

  • 把镜像与运行中的容器混为一谈,或认为容器拥有独立内核
  • 把密钥复制进构建上下文或镜像层,事后删除文件却仍留在历史层
  • 使用固定共享名称、--privileged、宿主根目录挂载或 docker system prune 完成基础练习

分层任务

基础任务

根据一份 Dockerfile 标出构建输入、镜像层、运行命令和端口映射,并运行教师提供的镜像。

标准任务

独立构建静态站点镜像,保存 Dockerfile、版本、镜像 ID、回环访问、inspect 与精确清理证据。

挑战任务

固定基础镜像 digest,比较有/无缓存构建并加入非 root USER 与健康检查,说明每项改善的边界。

关联知识点

延伸阅读

学习状态:未学习

Day 13

容器编排入门

建议时长:75 分钟

本日 CO:CO1 CO8

本日概要

Docker Compose 用一份声明式 YAML 描述本机多容器应用的服务、网络、卷和依赖;Kubernetes 将目标状态进一步组织为 Pod、Deployment 与 Service:Pod 是最小可部署单元并共享部分网络/存储上下文,Deployment 管理副本与滚动更新,Service 为动态 Pod 集合提供稳定网络抽象。二者都不自动解决数据备份、密钥管理和应用就绪性,入门练习以配置校验和受控本地部署为主。

听书与视频

本日听书

4 分钟 · MP3 · 双主持人讲解

B 站讲解

14-飞升入定-多机多容器编排与K8S讲解

荫马塘机房管理员 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能说明 Dockerfile 与 Compose 文件分别描述构建制品和运行拓扑
  • 能区分 Kubernetes Pod、Deployment 与 Service 的职责和生命周期
  • 能用 config/dry-run 在创建资源前发现语法与默认值问题
  • 能为多容器练习记录镜像身份、网络、数据边界、验证和完整清理步骤

核心讲解

Compose 把本机运行关系写成可审查配置

Compose 文件声明服务所用镜像或 build、端口、环境变量、网络和卷;`docker compose config` 可解析变量并输出归一化配置,是启动前的重要检查。`depends_on` 表达启动依赖并不天然证明下游业务已就绪,服务仍需健康检查、重试和正确失败处理。具名卷可能在容器删除后继续存在,所以 `down` 与 `down --volumes` 的数据后果不同。

可复现 Compose 实验要保存 compose.yaml、`.env.example`、镜像 digest、Compose 版本和验证命令,真实密码不能提交。端口仍只绑定回环,卷只装载实验目录。`project_name` 必须由本次随机令牌生成;清理前要把当前资源 ID 与启动成功后保存的 `project_ids` 对照,并核验 Docker 自动设置的 `com.docker.compose.project` 归属标签。不能仅凭项目名执行 down,更不能对归属不明的共享项目执行 `down --volumes` 或全局 prune。

Kubernetes 用控制器协调期望状态

Pod 包含一个或多个紧密协作容器,共享网络 namespace 和可声明的卷;单独 Pod 通常是短暂对象。Deployment 保存 Pod 模板和副本期望,由控制器通过 ReplicaSet 推进更新与替换;Service 用标签选择器关联一组后端,为变化的 Pod 提供稳定访问方式。Service 不是 Deployment 的别名,Deployment 也不会自动持久化数据库。

初学者无需立刻创建集群资源。`kubectl create ... --dry-run=client -o yaml` 可在客户端生成清单,再人工检查镜像、标签、selector 与端口是否闭合;客户端 dry-run 不证明服务器版本、准入策略或运行结果。若进入共享集群,必须使用教师分配 namespace、最小 RBAC、资源限额和清理清单,本日不要求集群管理员权限。

实践任务

用 Compose 启动一个只绑定回环端口的前端服务并验证/清理,再用 kubectl 客户端 dry-run 生成 Deployment 与 Service 清单。

  • 实验边界——平台:Docker Compose v2;kubectl 可选且只做 client dry-run;权限:普通 Docker 用户,无集群管理员权限;安全:回环随机端口、无真实密钥;清理:只对 ID 清单和 `com.docker.compose.project` 归属标签都匹配的本次项目执行 down,不删除卷。
  • 创建只含 `web` 服务的 compose.yaml,使用 nginx:alpine、端口 `127.0.0.1::80` 和只读运行设置;令 `lab_dir=$(mktemp -d)`、`lab_token=$(basename "$lab_dir" | tr -cd '[:alnum:]' | tr '[:upper:]' '[:lower:]')`、`project_name="aiknow-week2-$lab_token"`,再执行 `docker compose -p "$project_name" config` 检查最终端口、镜像和卷。
  • 启动前分别列出带 `com.docker.compose.project=$project_name` 归属标签的容器、网络和卷;任一已存在就报告“创建失败:项目资源已存在”并停止,绝不执行 down。检查通过后执行 `docker compose -p "$project_name" up -d`;仅在成功后保存包含容器和项目网络完整 ID 的 `project_ids`,再用 `docker compose -p "$project_name" ps`、`docker compose -p "$project_name" port web 80` 与 curl 留证。
  • 清理前重列项目容器/网络,确认每个当前 ID 都在 `project_ids` 中且每项 `com.docker.compose.project` 归属标签都精确等于 `project_name`;创建失败、出现额外 ID 或标签不符时停止并报告,不执行清理。核验通过后只运行 `docker compose -p "$project_name" down --remove-orphans`。本练习不声明卷,因此不使用 `--volumes`;若扩展出卷,须单独记录卷 ID 和所有权标签,并只按已核验的精确 ID 删除。
  • 如已安装 kubectl,运行 `kubectl create deployment week2-web --image=nginx:alpine --dry-run=client -o yaml` 和 `kubectl create service clusterip week2-web --tcp=80:80 --dry-run=client -o yaml`;检查 Deployment 标签与 Service selector,不执行 apply。

自测与答案

第 1 题

Dockerfile 与 Compose 文件分别回答什么问题?

尚未检查本题。

查看答案与评价要点

参考答案:Dockerfile 描述如何构建镜像制品;Compose 文件描述服务如何以镜像、网络、端口、卷和环境配置共同运行。

评价要点:指出构建与运行区别;列出 Compose 至少两类拓扑信息;不把二者互换

第 2 题

Kubernetes 中 Deployment 和 Service 为什么都需要?

尚未检查本题。

查看答案与评价要点

参考答案:Deployment 管理 Pod 副本与更新,Service 通过 selector 为变化的后端 Pod 提供稳定网络访问;二者职责不同。

评价要点:Deployment 对副本/更新;Service 对稳定访问;说明通过标签关联

尚未完成自测。

今日完成标准

  • Compose 配置可解析、服务可从回环地址访问,镜像与项目身份均有记录
  • 能准确解释 Pod、Deployment、Service 和 selector 关系及 client dry-run 的证据边界
  • 项目容器、网络和实验卷按清单清理,无真实凭据和共享集群变更

常见错误与纠正提示

  • 把 Dockerfile 当运行多个服务的拓扑文件,或把 Compose 当镜像构建格式
  • 认为 depends_on 等同于业务就绪,忽略健康检查、重试与失败传播
  • 把 Pod、Deployment、Service 混为同一对象,或在共享集群直接使用 default namespace 和管理员凭据

分层任务

基础任务

给 Compose 与 Kubernetes 对象卡片配对职责,并只运行 config 与 kubectl client dry-run。

标准任务

完成 Compose 启动、访问、证据留存和精确清理,再解释生成的 Deployment/Service 标签选择关系。

挑战任务

加入第二个无状态服务与健康检查,画出 Compose 网络和 Kubernetes Service 端点变化,并说明持久数据仍缺什么。

关联知识点

延伸阅读

学习状态:未学习

Day 14

周末复盘

建议时长:90 分钟

本日 CO:CO1 CO8

本日概要

把本周知识收束为同一工作负载的三种边界:裸机/主机直接进程使用主机内核与硬件,虚拟机通过 KVM/QEMU 等栈获得虚拟硬件并运行独立来宾内核,容器把进程置于 namespaces/cgroups 与分层文件系统中而共享主机内核。比较必须固定任务、输入、CPU/内存限制、版本、测量方法与重复次数,同时观察启动、资源、隔离、可移植性、运维和清理;不能用一次更快的结果宣布某种形态普遍优胜。

听书与视频

本日听书

6 分钟 · MP3 · 双主持人讲解

B 站讲解

裸机、虚拟机、容器到底该用哪个 | 项目部署 | 虚拟化技术 | 容器docker | 架构101

御风大世界 · 已核验 2026-08-29

在 B 站打开

学习目标

  • 能沿硬件、内核、进程、文件与网络层比较裸机、虚拟机和容器
  • 能设计同输入、同测量口径且重复执行的三环境实验,并识别不可控变量
  • 能用命令输出、版本、时间和官方来源支持结论,区分观察与推断
  • 能从隔离、性能、可移植性和运维成本反思技术选择而非寻找万能赢家

核心讲解

先统一比较单位再解释差异

裸机在本作业中指工作负载直接运行于物理 Linux 主机,不经过来宾 VM;若主机本身是云虚拟机,必须标为 VM,不能伪称裸机。VM 运行独立来宾内核并看到虚拟设备,容器共享宿主内核。三者的启动时间、空闲占用和 I/O 路径不同,但实际结果还受镜像缓存、CPU 架构、调度、后台负载、存储和热身影响。

可比实验应使用同一脚本与输入,固定线程数和资源上限,每种环境至少重复三次并保存原始结果。计时须明确是冷启动、热启动还是任务执行,内存须说明 RSS、宿主总增量或来宾分配量。若工具口径无法等价,就并排呈现并解释不可比,不把不同含义的数字强行画进同一排名。

隔离和证据与性能同等重要

隔离矩阵至少检查内核、PID、文件系统、网络、资源控制和管理面。VM 的独立来宾内核扩大边界但也增加镜像与补丁对象;容器启动轻量却共享内核,特权设置会削弱隔离;裸机直接进程路径简单,但多个任务共享主机资源。安全结论必须写清配置,不可只用“VM 安全、容器不安全”概括。

来源表应把每条官方 HTTPS 文档映射到具体声明,并由学习者记录实际访问日期;课程作者的 verified_on 不能代替。实验表保存 OS/内核、QEMU/KVM、Docker、镜像或来宾身份、命令、退出码、时间戳、重复结果和清理证据。反思要说明结论适用范围、最强混杂变量、一次失败观察和下一轮如何改善。

实践任务

完成“VM、容器与裸机可复现实验”草稿,用同一只读任务比较三种环境,提交证据、隔离矩阵、来源与反思。

  • 实验边界——平台:授权物理 Linux、其上的学习 VM 与 rootless Docker/桌面容器;权限:普通用户操作本人资源;安全:只读 CPU/文件任务、无公网暴露;清理:逐环境按资源清单停止并删除实验项。
  • 建立环境清单:运行并记录 `uname -a`、`systemd-detect-virt || true`、CPU/内存限制与工具版本;只有 systemd-detect-virt 和资产记录均支持时才把物理主机标为裸机。
  • 在三种环境运行同一固定输入的校验/压缩或教师脚本,各重复至少三次;记录冷/热条件、耗时、最大内存、退出码和原始输出,不跨口径计算所谓加速比。
  • 完成内核、PID、文件、网络、资源、管理面六维隔离矩阵与来源映射;停止 VM、删除本人容器/镜像/临时文件,保留清理后检查和限制反思。

自测与答案

第 1 题

容器与虚拟机最关键的内核边界差异是什么?

尚未检查本题。

查看答案与评价要点

参考答案:常见容器共享宿主内核并隔离进程视图;虚拟机运行独立来宾内核并通过虚拟硬件访问主机资源。

评价要点:指出容器共享宿主内核;指出 VM 独立来宾内核;联系虚拟设备或隔离边界

第 2 题

三环境耗时不同,为什么仍不能立即宣布最快者是所有场景最佳方案?

尚未检查本题。

查看答案与评价要点

参考答案:单一任务和有限样本不能覆盖隔离、资源、缓存、I/O、运维与可移植性,结论必须限定条件并用重复实验与多维证据支持。

评价要点:限制外推范围;指出至少两个混杂变量;纳入隔离或运维权衡

尚未完成自测。

今日完成标准

  • 三环境身份、版本、资源与虚拟化层次均有证据,未把虚拟主机伪标为裸机
  • 同一任务至少三次重复,原始输出、时间口径、异常和不可比项完整保留
  • 六维隔离矩阵、官方来源与实际访问日期、清理记录和反思均可由同伴复核

常见错误与纠正提示

  • 把运行在云 VM 或桌面虚拟化中的主机误标为裸机,隐藏真实环境层次
  • 只运行一次或混用冷启动、热缓存和不同资源限制,仍给出普遍性能排名
  • 把隔离写成产品标签,不检查内核、权限、挂载、网络和管理面配置

分层任务

基础任务

使用教师提供的三环境证据包完成层次图和六维隔离矩阵,指出三项不可直接比较的指标。

标准任务

在授权实验环境完成三次重复的同任务比较,提交原始证据、来源、清理记录和四维量规自评。

挑战任务

加入受控资源限制与冷/热两组实验,用中位数和离散程度描述结果,并提出能推翻当前结论的后续实验。

关联知识点

延伸阅读

学习状态:未学习