目录

Docker-00 学习路线与实验环境:怎样真正学懂 Docker

1. 这个系列要解决什么问题

学 Docker 最常见的误区是从命令表开始:背完 pullrunexec,仍然解释不了容器为什么退出、端口为什么不通、数据为什么丢失、内存为什么显示异常,也不知道镜像怎样安全上线。

本系列按四层建立知识体系:

使用层:CLI、Dockerfile、Compose
对象层:镜像、容器、网络、卷、registry
运行时层:dockerd、containerd、shim、runc、OCI
内核层:namespace、cgroup、overlayfs、veth、netfilter、LSM

学习完成后应该能够:

  1. 从零安装并配置一个可维护的 Docker Engine。
  2. 构建体积合理、可复现、非 root、不会泄露秘密的镜像。
  3. 解释一次 docker run 在 daemon、runtime 和内核中发生了什么。
  4. 设计容器网络、存储、日志、资源限制和 restart policy。
  5. 用 Compose 搭建多服务开发/测试环境。
  6. 对启动失败、OOM、CPU throttling、网络不通、磁盘满和权限错误进行证据驱动的排障。
  7. 设计镜像 CI/CD、漏洞扫描、发布、回滚和备份恢复流程。
  8. 系统回答 Docker 高频面试题,并能继续应对追问。

2. 完整学习地图

第一阶段:建立正确模型

  • 01 基础概念与架构:容器与 VM、镜像/容器/仓库、OCI、Docker Engine 组件。
  • 02 安装与配置:Linux Engine、Docker Desktop、daemon、日志、网络地址池和 rootless。
  • 03 镜像、容器与命令:对象生命周期、状态、退出码、restart policy 和现场保留。

这一阶段的验收不是“会启动 Nginx”,而是能回答:镜像在哪里变成进程、容器退出后哪些数据仍存在、CLI 为什么可以管理远程 daemon。

第二阶段:掌握工程能力

  • 04 Dockerfile:构建上下文、layer cache、多阶段、多架构、secret 和供应链。
  • 05 网络:network namespace、veth、bridge、NAT、DNS、端口发布和抓包。
  • 06 存储:容器可写层、volume、bind、tmpfs、UID/GID、备份与磁盘治理。
  • 07 Compose:服务模型、依赖、健康检查、网络、环境覆盖、profile 和 reconciliation。

这一阶段要独立完成一个“API + DB + Cache + Proxy”环境,并能够删除、重建所有无状态容器而不丢业务数据。

第三阶段:深入原理与生产

  • 08 底层原理:namespace/cgroup/overlayfs、containerd/shim/runc、PID 1。
  • 09 安全、性能与可观测性:最小权限、seccomp/LSM、资源模型、日志指标和事件。
  • 10 实战项目:Go + PostgreSQL + Redis + Nginx、迁移、CI/CD、发布和灾备。
  • 11~12 面试题:基础命令、网络存储、运行时、安全和生产案例。

这一阶段的验收是:不依赖“重启试试”,能从状态、日志、cgroup、network namespace 和宿主机数据定位根因,并给出可回滚修复。

3. 实验环境

3.1 Linux 原生环境

学习底层原理最推荐一台 Linux 虚拟机:

  • Ubuntu 24.04 LTS 或当前受支持的稳定发行版。
  • 2~4 CPU、4~8 GB 内存、至少 30 GB 空闲磁盘。
  • Docker Engine 26+、Compose v2、Buildx。
  • iproute2util-linuxjqcurltcpdumpstrace 等观察工具。
docker version
docker info
docker compose version
docker buildx version
uname -a
stat -fc %T /sys/fs/cgroup

文章里的 /proc、cgroup、iptables/nftables、overlayfs 和 systemd 实验应在 Linux 上完成。

3.2 macOS/Windows 环境

Docker Desktop 足以学习镜像、容器、Dockerfile 和 Compose,但 daemon 实际位于 Linux VM 中:

macOS/Windows CLI
Desktop API/虚拟网络/文件共享
Linux VM 中的 dockerd/containerd
Linux 容器

因此,宿主 ps 看不到同样的 Linux 容器进程,/var/lib/docker 位于 VM 磁盘镜像,bind mount 和网络性能也可能不同。学习 08~09 时最好补一台 Linux VM。

4. 创建安全的实验目录

mkdir -p "$PWD/docker-labs"
cd "$PWD/docker-labs"
docker context show

每次实验前确认 context,避免误连远程生产 daemon:

docker context ls
docker context inspect "$(docker context show)"

统一给实验对象加 label,便于只清理自己的资源:

docker run --label course=docker-series --name hello \
  --rm alpine:3.20 echo hello

docker ps -a --filter label=course=docker-series
docker image ls --filter label=course=docker-series

不要为了清理实验环境直接执行 docker system prune -a --volumes。优先用 Compose 项目名、容器名或 label 精确定位。

5. 推荐的学习方法

每个知识点执行四步:

预测:执行前写下你认为会发生什么
运行:执行最小可复现实验
观察:同时看 Docker 对象和 Linux 内核视图
破坏:主动制造失败,再用证据恢复

例如学习端口映射,不应只运行 -p 8080:80,还应观察:

docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
docker port web
docker inspect web | jq '.[0].NetworkSettings.Networks'
ss -lntp | grep ':8080'
curl -v http://127.0.0.1:8080

然后让 Nginx 只监听错误端口、断开网络、修改宿主防火墙,分别记录症状差异。

6. 贯穿全系列的项目

最终项目包含:

Nginx
  ├── 静态文件
  └── /api → Go API
               ├── PostgreSQL
               └── Redis

每完成一篇就给它增加一层能力:

篇章 项目增量
03 手工启动 API,观察状态、退出码和 restart policy
04 编写多阶段 Dockerfile,构建 amd64/arm64 镜像
05 创建 edge/app/data 网络,限制可达关系
06 为数据库和 Redis 设计 volume、备份和恢复
07 用 Compose 统一服务、健康检查和配置
08 用 namespace/cgroup/overlayfs 解释运行状态
09 非 root、只读根、drop capability、日志指标和限额
10 接入 CI/CD,按 digest 发布,演练回滚和恢复

7. 通用排障框架

遇到问题时,先不要修改现场:

1. 描述现象:谁在什么时候观察到什么
2. 确定对象:镜像、容器、网络、卷、daemon 还是应用
3. 建立时间线:部署、退出、OOM、健康变化、人工操作
4. 收集证据:inspect、logs、events、metrics、内核日志
5. 提出假设:每个假设必须能被一个实验证伪
6. 最小修复:先恢复服务,再处理根因
7. 验证与预防:增加测试、限制、监控和 runbook

第一轮采集:

docker ps -a --no-trunc
docker inspect CONTAINER > container.inspect.json
docker logs --timestamps CONTAINER > container.log 2>&1
docker events --since 30m --until 0s > docker.events.log
docker system df -v

网络、存储和 cgroup 问题再进入对应层,不要一开始就进入容器安装几十个调试工具,破坏可复现性。

8. 学习过程中的危险操作

以下命令必须理解后再运行:

  • docker system prune -a --volumes:可能删除未被当前容器引用的数据卷。
  • docker compose down -v:删除当前 Compose 项目声明的 named volume。
  • docker run --privileged:显著放宽 capability、设备和安全策略。
  • -v /:/host:把宿主根目录暴露给容器。
  • 挂载 /var/run/docker.sock:通常给予接近宿主 root 的 daemon 控制权。
  • 修改 /var/lib/docker:可能破坏 Engine 内部数据和引用关系。
  • 在生产机重启 Docker daemon:可能影响网络、发布和没有正确配置的容器。

实验危险权限时使用一次性 Linux VM,不在办公电脑和生产服务器上直接验证容器逃逸能力。

9. 学完后的自测标准

基础

  • 不看资料写出一个有健康检查、资源限制和 restart policy 的 docker run
  • 解释 runcreatestartstopkillrm 的状态变化。
  • 解释 tag 与 digest、镜像层与容器层、volume 与 bind mount。

原理

  • 画出 CLI → dockerd → containerd → shim → runc → kernel。
  • 在宿主找到容器 PID、network namespace、cgroup 和 overlay mount。
  • 解释 PID 1、copy-up、CPU throttling、cgroup OOM 和端口 NAT。

工程

  • 构建非 root、多阶段、多架构镜像,不把秘密放入 layer。
  • 用 Compose 启动四个服务,能重建容器、恢复数据库、轮换配置。
  • 对 crash loop、OOM、DNS、权限和磁盘满分别写出排障 runbook。

生产

  • CI 生成镜像、SBOM 和扫描结果,发布记录 digest。
  • 应用正确处理 SIGTERM,入口能摘流,数据库迁移向前/向后兼容。
  • 有日志、指标、告警、备份、恢复演练和明确回滚条件。

10. 系列文章

  1. 基础概念与架构
  2. 安装与配置
  3. 镜像、容器、命令与 restart policy
  4. Dockerfile 与镜像构建
  5. 网络原理与排障
  6. 数据卷与存储
  7. Compose 多容器编排
  8. 底层原理与运行时
  9. 安全、性能与可观测性
  10. 实战项目与生产发布
  11. 高频面试题:基础与命令
  12. 高频面试题:原理与生产

不要跳过实验直接看面试题。能在异常现场解释“证据为什么支持这个结论”,才算真正掌握 Docker。


上一篇 下一篇
01-基础概念与架构