Docker-00 学习路线与实验环境:怎样真正学懂 Docker
1. 这个系列要解决什么问题
学 Docker 最常见的误区是从命令表开始:背完 pull、run、exec,仍然解释不了容器为什么退出、端口为什么不通、数据为什么丢失、内存为什么显示异常,也不知道镜像怎样安全上线。
本系列按四层建立知识体系:
使用层:CLI、Dockerfile、Compose
↓
对象层:镜像、容器、网络、卷、registry
↓
运行时层:dockerd、containerd、shim、runc、OCI
↓
内核层:namespace、cgroup、overlayfs、veth、netfilter、LSM
学习完成后应该能够:
- 从零安装并配置一个可维护的 Docker Engine。
- 构建体积合理、可复现、非 root、不会泄露秘密的镜像。
- 解释一次
docker run在 daemon、runtime 和内核中发生了什么。 - 设计容器网络、存储、日志、资源限制和 restart policy。
- 用 Compose 搭建多服务开发/测试环境。
- 对启动失败、OOM、CPU throttling、网络不通、磁盘满和权限错误进行证据驱动的排障。
- 设计镜像 CI/CD、漏洞扫描、发布、回滚和备份恢复流程。
- 系统回答 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。
iproute2、util-linux、jq、curl、tcpdump、strace等观察工具。
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。 - 解释
run、create、start、stop、kill、rm的状态变化。 - 解释 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. 系列文章
- 基础概念与架构
- 安装与配置
- 镜像、容器、命令与 restart policy
- Dockerfile 与镜像构建
- 网络原理与排障
- 数据卷与存储
- Compose 多容器编排
- 底层原理与运行时
- 安全、性能与可观测性
- 实战项目与生产发布
- 高频面试题:基础与命令
- 高频面试题:原理与生产
不要跳过实验直接看面试题。能在异常现场解释“证据为什么支持这个结论”,才算真正掌握 Docker。
| 上一篇 | 下一篇 |
|---|---|
| — | 01-基础概念与架构 |