# 《Docker技术入门与实战(第2版)》知识点全解 > AI生成|2026年10月29日|codebuddy|原书:杨保华 戴王剑 曹亚仑《Docker技术入门与实战(第2版)》,机械工业出版社,2017-02-01 > **我的阅读**:进度 100%|累计 1小时16分钟|开始 2018-03-25|最近 2020-07-19|读完 2020-07-15 **一句话总结**:把「应用 + 运行环境」打包成可分发的镜像,用容器秒级启动隔离进程,再沿「镜像—容器—仓库—编排」这条主线,把开发、测试、交付串成一条可复现的工程流水线。 **适合谁**:要把本地应用交付到服务器的后端、运维、测试工程师;想搞清 Kubernetes 那些对象从哪来的开发者;被「我这能跑」折磨过的虚拟机老用户。 **不适合谁**:只想照抄一条命令跑起来的人(本书有大量原理与手工配置);已经把容器当日常工具、想深入 runc / cgroup v2 / CRI 的内核级读者——本书技术面停在 2017 年。 **前置知识**:Linux 基础(进程、文件系统、权限、网卡与端口)、shell 操作;有 Git 式的「分层 / 快照」直觉会轻松很多。 ## 一、全书地图 四段递进:**会用 → 能用 → 敢用 → 会选**。 | 部分 | 包含章节 | 解决什么 | 与其他部分的关系 | |---|---|---|---| | 第一部分 基础入门 | 第2章 核心概念与安装配置;第3章 使用Docker镜像;第4章 操作Docker容器;第5章 访问Docker仓库;第6章 数据管理;第7章 端口映射与容器互联;第8章 使用Dockerfile创建镜像 | 建立镜像/容器/仓库三件套的心智模型,打通单机日常操作 | 全书地基,后面每章都在复用这七个动作 | | 第二部分 实战案例 | 第10章 为镜像添加SSH服务;第11章 Web服务与应用;第12章 数据库应用;第13章 分布式处理与大数据平台;第14章 编程开发;第15章 容器与云服务;第16章 容器实战思考 | 把地基压到真实负载上:Web、DB、大数据、CI | 验证第一部分,并暴露「单容器不够用」,为第三、四部分铺垫 | | 第三部分 进阶技能 | 第18章 配置私有仓库;第19章 安全防护与配置;第20章 高级网络功能;第21章 libnetwork插件化网络功能 | 从「能跑」到「敢在生产跑」:自建仓库、隔离与权限、网络模型 | 把第5、7章的仓库与网络做深 | | 第四部分 开源项目 | 第23章 Docker Machine;第24章 Docker Compose;第25章 Docker Swarm;第26章 Mesos;第27章 Kubernetes;第28章 其他相关项目 | 单机之外:多主机、多容器、集群调度 | 第16章「容器实战思考」的答案集 | | 附录 | 附录B Docker命令查询;附录C 参考资源链接 | 速查与索引 | 工具性收尾 | 一条主线:**镜像(第3、8章)→ 容器(第4章)→ 仓库(第5、18章)→ 存储与网络(第6、7、20、21章)→ 编排(第23—27章)**;安全(第19章)横切所有层。 ## 二、核心知识点 ### 1. 镜像由只读层叠加而成,不是一个「安装包」 **是什么**:镜像由若干只读层组成,Dockerfile 里每条指令通常产生一层;容器启动时在最上面加一个可写层。 **为什么重要**:层可被多个镜像共享,所以拉取、构建、存储只传增量;这也是「镜像怎么 2GB」「改一行代码为何重装依赖」的根源。 **怎么用**:变化频率低的指令放前面(基础镜像、系统依赖),变化频繁的放后面(复制源码),缓存命中率最高。 **常见误区**:把 `RUN apt-get update` 和 `RUN apt-get install` 分成两条——各自成层,缓存命中旧层就会装到过期的包索引。应合并为一条,并在同一层清理缓存。 ### 2. 容器 = 被 namespace 隔离、被 cgroup 限量的普通进程 **是什么**:容器不是轻量虚拟机,没有独立内核。namespace 管「看不见」(PID、网络、挂载、UTS、IPC、user),cgroup 管「用不多」(CPU、内存、IO)。 **为什么重要**:这决定了全部优缺点——启动毫秒级、密度高;但内核共享,一个逃逸漏洞影响面大,也不能在容器里跑异构内核。 **怎么用**:显式 `--memory`、`--cpus` 限量,别信默认值;在容器里 `ps` 只看到自己,这是 PID namespace 的正常表现,不是故障。 **常见误区**:把容器当虚拟机,塞进 systemd、sshd、多个守护进程——与「一容器一进程」模型对抗,日志、信号、退出码全都会失真。 ### 3. 生命周期是分离的:create / start / stop / rm 各管一段 **是什么**:`run` = `create` + `start`;容器停止后文件系统与可写层仍在,只有 `rm` 才真正删除。 **为什么重要**:调试时数据「丢了」多半不是没保存,而是随手加了 `--rm`;生产上重启策略决定宿主机重启后能否自愈。 **怎么用**:`docker run -d --restart=unless-stopped --name web nginx`;排查用 `docker exec -it web sh` 进容器,而不是 `attach`(attach 退出可能带走主进程)。 **常见误区**:`docker ps` 看不到就以为容器没了——要 `-a` 才含已退出的;改过配置后用 `start` 重启,配置不会重新生效,必须删掉重建。 ### 4. 数据管理三选一:卷、绑定挂载、tmpfs **是什么**:volume 由 Docker 管理,落在宿主机的数据目录;bind mount 直接挂宿主路径;tmpfs 只存内存。 **为什么重要**:可写层随容器删除而消失,凡有状态的东西(数据库、上传文件、日志)必须外置。 **怎么用**:数据库用命名卷 `-v dbdata:/var/lib/mysql`;开发时用绑定挂载把源码挂进去做热更新;敏感临时数据用 `--tmpfs`。 **常见误区**:生产用绑定挂载代替卷——它依赖宿主机目录结构与权限,跨主机迁移即失效;卷则可以换驱动扩展到 NFS、云盘。 ### 5. 容器互联从 `--link` 走向自定义网络的内嵌 DNS **是什么**:`-p 宿主端口:容器端口` 做 NAT 转发;早期 `--link` 靠环境变量互相发现,后被自定义 bridge 网络的服务名解析取代。 **为什么重要**:容器 IP 重启就变,任何写死 IP 的配置都是定时炸弹。 **怎么用**:`docker network create appnet`,Web 与 DB 都接入,Web 里直接用服务名 `db:3306` 连接。 **常见误区**:继续用已废弃的 `--link`;把数据库端口 `-p 3306:3306` 发布到公网——容器间通信根本不需要发布端口,只有外部访问才需要。 ### 6. Dockerfile 是构建契约,不是脚本 **是什么**:`FROM`/`RUN`/`COPY`/`ADD`/`CMD`/`ENTRYPOINT`/`EXPOSE`/`ENV`/`WORKDIR`/`USER`/`VOLUME` 各司其职;`CMD` 给默认可被覆盖的参数,`ENTRYPOINT` 定义入口。 **为什么重要**:可复现性完全取决于 Dockerfile 是否把环境写全——凡是手工 `exec` 进去改的东西,下次构建就没了。 **怎么用**:`ENTRYPOINT ["/app/server"]` 配 `CMD ["--port=8080"]`,固定入口又允许传参;先 `COPY` 依赖清单再 `COPY` 源码,复用依赖层缓存。 **常见误区**:用 `ADD` 代替 `COPY`(会自动解压、支持远程 URL,行为不透明);生产直接跑 `latest`。 ### 7. 仓库与标签:`latest` 不是「最新」,只是「默认」 **是什么**:Registry 存镜像,一个镜像可挂多个 tag,不带 tag 时默认 `latest`。 **为什么重要**:tag 是**可被覆盖的指针**,同一个 tag 今天和明天可能是两份二进制,这是「昨天还好好的」类事故的常见来源。 **怎么用**:生产只用不可变标识——语义化版本 tag 或 digest(`@sha256:...`);打标签、推送交给 CI,本地不手工发版。 **常见误区**:以为 `pull` 会自动更新本地 `latest`——只有显式 pull 才会;把凭证写进 Dockerfile 的 `ENV`,它会永久留在镜像层里。 ### 8. 私有仓库:能 push 不等于能运维 **是什么**:官方 `registry` 镜像可起最简仓库;生产还需要 TLS、认证、存储后端、垃圾回收,Harbor 一类项目在其上加了权限、复制、扫描。 **为什么重要**:镜像里常含内部代码与配置,不能上公网;而裸 registry 默认既不认人也不加密。 **怎么用**:先跑 `registry:2` 打通流程,再前置反向代理做 TLS 与 basic auth;`docker login` 后推到 `registry.example.com/team/app:1.0`。 **常见误区**:把无认证的 registry 直接暴露到内网,等于开放匿名推送;删了 tag 磁盘并不释放,需要显式回收(具体命令随版本变化,**待核对**)。 ### 9. 安全是一组默认值问题 **是什么**:容器默认以 root 运行、带一批 capability、文件系统可写;加固手段包括非 root 用户、`--read-only`、`--cap-drop`、seccomp/AppArmor 策略、user namespace 重映射。 **为什么重要**:共享内核意味着权限就是边界;一次 RCE 加上 root 容器,基本等于宿主机失守。 **怎么用**:Dockerfile 里 `USER app`;运行时 `--cap-drop=ALL --cap-add=NET_BIND_SERVICE`;只挂必要目录。 **常见误区**:以为「容器隔离所以安全」——隔离强度取决于配置;为图方便把宿主 docker socket 挂进容器,等于把 root 级控制权交出去。 ### 10. 网络模式决定连通性、性能与故障形态 **是什么**:bridge(默认,NAT)、host(共用宿主网络栈)、none(无网络)、container(共享另一容器网络)、overlay(跨主机)、macvlan(容器持真实 MAC)。 **为什么重要**:选错模式会稳定复现三类故障——能通但慢、端口冲突、跨主机不通。 **怎么用**:性能敏感且端口不冲突用 host;要固定 IP 或接入既有 VLAN 用 macvlan;跨主机集群用 overlay。 **常见误区**:host 模式下还写 `-p`(无效);以为 bridge 能跨主机——它只在一台机器内。 ### 11. Compose:把一长串 `run` 变成声明式文件 **是什么**:用 YAML 描述多容器应用的服务、网络、卷与依赖,一条 `up` 全拉起。 **为什么重要**:它把「环境定义」从人的记忆和 README 搬进版本控制,是本地开发与 CI 的最小可用编排。 **怎么用**:每个服务写 `image`/`build`/`ports`/`environment`/`volumes`/`depends_on`;注意 `depends_on` 只保证启动顺序,不保证依赖就绪。 **常见误区**:把 Compose 当生产集群编排——它默认单主机;用 `depends_on` 治「数据库没起来」,正解是应用侧重试或加健康检查。 ### 12. Machine 与 Swarm:Docker 原生的多主机答案 **是什么**:Machine 负责在本地或云上创建并配置好 Docker 主机;Swarm 把这些主机组成集群,提供 service、副本数、滚动更新、路由网格。 **为什么重要**:单机 Docker 解决不了高可用与横向扩容;Swarm 的价值是与 Docker CLI 原生一体、学习成本低。 **怎么用**:`docker swarm init` 拿到 join token,其余节点 `docker swarm join`;`docker service create --replicas 3` 声明期望状态。 **常见误区**:认为 Swarm 与 Kubernetes 等价——生态与调度能力差距明显;本书成书后社区重心已转向 K8s,选型看团队与生态,而不是「原生」二字。 ### 13. Kubernetes:把「期望状态」推到极致 **是什么**:以 Pod 为最小调度单元,用 Deployment / Service / ConfigMap 等对象声明期望状态,由控制循环不断向期望收敛。 **为什么重要**:它补上了 Compose 与 Swarm 的短板——自愈、滚动发布、服务发现、配置与密钥管理、多租户。 **怎么用**:抓住三层——对象(声明)→ 控制器(调谐)→ 节点代理与容器运行时(执行);迁移时把 Compose 的 service 映射成 Deployment + Service。 **常见误区**:把 K8s 当「更复杂的 Compose」,照搬单机习惯(Pod 里塞多进程、用宿主路径存数据);不写 requests/limits,调度与稳定性都会出问题。 ### 14. 体积与构建速度可以工程化 **是什么**:体积来自基础镜像、依赖、构建残留;速度来自缓存命中与并行。 **为什么重要**:镜像大小直接决定拉取时间、冷启动、存储成本与攻击面。 **怎么用**:选 slim/alpine 基础镜像(留意 glibc 兼容);`RUN` 合并并在同层清理包缓存;用 `.dockerignore` 排除无关文件;(多阶段构建属本书之后的演进,可作补充阅读) **常见误区**:为小而盲目换 alpine,撞上 musl 与预编译二进制的兼容问题;把 `.git`、`node_modules`、测试数据一起打进镜像。 ## 三、关键概念速查表 | 概念 | 一句话解释 | 用在哪儿 | |---|---|---| | Image 镜像 | 只读层叠加的可分发文件系统 + 元数据 | 交付物本体 | | Container 容器 | 镜像上加了可写层的运行实例 | 真正跑进程的地方 | | Registry 仓库 | 存放并分发镜像的服务 | 团队共享、CI 产物归档 | | Layer 层 | 一条构建指令的结果,可被共享复用 | 缓存、体积优化 | | Tag / Digest | 可变指针 / 不可变内容哈希 | 版本管理与可复现部署 | | Volume 数据卷 | Docker 管理的持久化存储 | 数据库、上传文件 | | Bind mount | 直接映射宿主目录 | 开发热更新、配置注入 | | Dockerfile | 构建镜像的声明式配方 | 环境即代码 | | namespace | 视图隔离(PID/网络/挂载等) | 容器「看起来像独立机器」 | | cgroup | 资源限额与统计 | 限制 CPU/内存,防止互相拖垮 | | bridge / host / overlay | 三种典型网络模式 | 单机默认 / 高性能 / 跨主机 | | Compose | 单机多容器编排的 YAML | 本地开发、CI 环境 | | Swarm | Docker 原生集群与服务编排 | 轻量集群、平滑上手 | | Pod | K8s 最小调度单元,可含多容器 | 集群部署的基本粒度 | | Service | 为 Pod 提供稳定访问入口 | 服务发现与负载均衡 | ## 四、可复用的方法/框架 **① 三层定位法(遇到任何容器问题先分层)** 构建期(Dockerfile / 缓存 / 基础镜像)→ 运行期(网络 / 存储 / 资源 / 权限)→ 编排期(副本 / 调度 / 服务发现)。先判断问题落在哪一层,再动手,避免「一上来就重装」。 **② 镜像瘦身四问** 基础镜像能不能更小?依赖是否只装了运行期需要的?构建残留有没有在同一层清掉?有没有把不该进镜像的文件(密钥、`.git`、测试数据)打进去? **③ 有状态 / 无状态判断清单** 需要持久化吗 → 要,就外置卷;需要多副本同时写吗 → 要,就得改架构或选支持集群的存储;启动依赖外部服务吗 → 要,就加重试与健康检查,而不是靠启动顺序。 **④ 上线前五问** 镜像是否用不可变 tag/digest?是否非 root 且最小 capability?端口是否只发布必要的?资源限额写了吗?日志是否走标准输出而非容器内文件? **⑤ 版本敏感提醒** 容器领域命令与默认行为变动频繁,本书成于 2017 年。凡涉及具体参数、默认值、组件废弃(如 `--link`)的结论,落地前一律以官方文档为准,把书当作**概念地图**而不是**命令手册**用。 ## 五、我的阅读轨迹 | 项目 | 数据 | |---|---| | 进度 | 100% | | 累计阅读 | 1小时16分钟 | | 开始阅读 | 2018-03-25 | | 最近阅读 | 2020-07-19 | | 读完时间 | 2020-07-15 | **复习建议**:全书已读完,但 76 分钟对应一本 30 万字级的实战书,属于「快速通读」而非精读,当时的理解大概率停留在「知道有这些命令」。建议按用途回看,而不是从头再读: - **写 Dockerfile 前**:回第3、8章,重点看分层与缓存,这是唯一每天都会用到的部分。 - **第一次上生产前**:回第19、20章,安全默认值与网络模式,这两章最容易被跳过、也最容易出事。 - **要搭多容器环境**:第24章 Compose,配合第6、7章的数据与互联。 - **需要补集群**:第25、27章对照读,理解「声明期望状态」这一共同思想,比记命令有用。 - **可略读**:第13、15、26、28章偏场景与生态综述,2017 年的工具选型今天多已变化,读思路即可。 ## 六、行动清单 1. 用一个自己的小项目写一份 Dockerfile,刻意把依赖层与源码层分开,观察两次构建的缓存命中差异。 2. 把一份 Compose 文件从零写出来,跑起「Web + 数据库」两个服务,用服务名而不是 IP 互连。 3. 给现有镜像做一次瘦身,记录优化前后的体积数字。 4. 用 `--memory`、`--cpus`、`--cap-drop`、非 root 用户重跑一次容器,确认服务仍正常。 5. 起一个本地 registry,完整走一遍 tag → push → 换机器 pull 的流程。 6. 重读第19章,把「不要挂 docker socket」「不要 root 运行」写成团队检查项。 7. 把本文第四节的「上线前五问」做成提交前的自查清单。 ## 七、延伸阅读 1. **《第一本Docker书》**——更薄的入门,命令与概念讲得更口语化。建议在本书**之前**或**并行**读,用来补手感;本书胜在覆盖面与体系。 2. **《Docker——容器与容器云》**——往原理走:namespace/cgroup 细节、网络实现、资源隔离。建议在本书**之后**读,正好补上本书「会用但没讲透」的那一层。 3. **《Kubernetes权威指南》**——从单机容器过渡到集群。建议**最后**读,且先把本书第24、25、27章过一遍,否则容易把 K8s 当成另一套无关的魔法。