具体描述
本书在详细分析Docker所依赖的技术栈的基础上,一步一步地通过代码实例,让读者可以自己循序渐进地用Go语言构建出一个容器的引擎。不同于其他Docker原理介绍或代码剖析的书籍,本书旨在提供给读者一条动手路线,一步一步地实现Docker的隔离性,构建Docker的镜像、容器的生命周期及Docker的网络等。本书涉及的代码都托管在GitHub上,读者可以对照书中的步骤从代码层面学习构建流程,从而精通整个容器技术栈。本书也对目前业界容器技术的方向和实现做了简单介绍,以加深读者对容器生态的认识和理解。
本书适合对容器技术已经使用过或有一些了解,希望更深层次掌握容器技术原理和最佳实践的读者。
作者简介
陈显鹭 阿里云高级研发工程师,对Docker有深入研究,是Docker多个项目的Contributor,专注于容器技术的编排与基础环境研究。爱好折腾源代码,热爱开源文化并积极参与社区开源项目的研发。
王炳燊 阿里云研发工程师,具有丰富的Linux开发经验,对Docker有深入研究,多次提交Docker Patch。目前从事阿里云容器服务网络方案的设计与实现,专注于容器技术的基础环境研究。
秦妤嘉阿里云高级研发工程师、DevOps工程师,有丰富的容器化持续集成和持续交付开发实战经验,进行过Jenkins源码分析改造和Jenkins插件开发。目前从事阿里云容器服务持续集成和持续交付方案的设计和实现。
目录信息
1.1 Docker ………………………………………………………………………………1
1.1.1 简介 …………………………………………………………………………1
1.1.2 容器和虚拟机比较 …………………………………………………………2
1.1.3 容器加速开发效率 …………………………………………………………3
1.1.4 利用容器合作开发 …………………………………………………………4
1.1.5 利用容器快速扩容 …………………………………………………………4
1.1.6 安装使用Docker ……………………………………………………………4
1.2 Go ……………………………………………………………………………………5
1.2.1 描述 …………………………………………………………………………5
1.2.2 安装Go ………………………………………………………………………6
1.2.3 配置GOPATH ………………………………………………………………6
1.3 小结 …………………………………………………………………………………7
第2章 基础技术………………………………………………………………………………8
2.1 Linux Namespace 介绍 ………………………………………………………………8
2.1.1 概念 …………………………………………………………………………8
2.1.2 UTS Namespace ………………………………………………………………10
2.1.3 IPC Namespace ………………………………………………………………11
2.1.4 PID Namespace ………………………………………………………………13
2.1.5 Mount Namespace ……………………………………………………………14
2.1.6 User Namespace ………………………………………………………………16
XII 自己动手写 Docker
2.1.7 Network Namespace ………………………………………………………… 18
2.2 Linux Cgroups 介绍 ………………………………………………………………… 20
2.2.1 什么是Linux Cgroups ……………………………………………………… 20
2.2.2 Docker 是如何使用Cgroups 的 …………………………………………… 24
2.2.3 用Go 语言实现通过cgroup 限制容器的资源 …………………………… 25
2.3 Union File System …………………………………………………………………… 26
2.3.1 什么是Union File System …………………………………………………… 26
2.3.2 AUFS ………………………………………………………………………… 27
2.3.3 Docker 是如何使用AUFS 的 ……………………………………………… 27
2.3.4 自己动手写AUFS…………………………………………………………… 34
2.4 小结 ………………………………………………………………………………… 37
第3 章 构造容器……………………………………………………………………………… 38
3.1 构造实现run 命令版本的容器 …………………………………………………… 38
3.1.1 Linux proc 文件系统介绍 …………………………………………………… 38
3.1.2 实现 run 命令 ……………………………………………………………… 39
3.2 增加容器资源限制 ………………………………………………………………… 45
3.2.1 定义Cgroups 的数据结构 ………………………………………………… 45
3.2.2 在启动容器时增加资源限制的配置 ……………………………………… 51
3.3 增加管道及环境变量识别 ………………………………………………………… 53
3.4 小结 ………………………………………………………………………………… 58
第4 章 构造镜像……………………………………………………………………………… 59
4.1 使用busybox 创建容器 …………………………………………………………… 59
4.1.1 busybox ……………………………………………………………………… 59
4.1.2 pivot_root …………………………………………………………………… 60
4.2 使用AUFS 包装busybox …………………………………………………………… 63
4.3 实现volume 数据卷 ………………………………………………………………… 67
4.4 实现简单镜像打包 ………………………………………………………………… 75
4.5 小结 ………………………………………………………………………………… 77
第5 章 构建容器进阶………………………………………………………………………… 78
5.1 实现容器的后台运行 ……………………………………………………………… 78
5.2 实现查看运行中容器 ……………………………………………………………… 82
5.2.1 准备数据 …………………………………………………………………… 82
5.2.2 实现mydocker ps …………………………………………………………… 87
5.3 实现查看容器日志 ………………………………………………………………… 90
5.4 实现进入容器Namespace ………………………………………………………… 93
5.4.1 setns ………………………………………………………………………… 94
5.4.2 Cgo …………………………………………………………………………… 94
5.4.3 实现命令 …………………………………………………………………… 94
5.5 实现停止容器 ……………………………………………………………………… 100
5.6 实现删除容器 ……………………………………………………………………… 104
5.7 实现通过容器制作镜像 …………………………………………………………… 105
5.8 实现容器指定环境变量运行 ……………………………………………………… 117
5.8.1 修改runCommand …………………………………………………………… 117
5.8.2 修改Run 函数 ……………………………………………………………… 117
5.8.3 修改NewParentProcess 函数 ……………………………………………… 118
5.8.4 修改mydocker exec 命令 …………………………………………………… 119
5.9 小结 ………………………………………………………………………………… 121
第6 章 容器网络……………………………………………………………………………… 122
6.1 网络虚拟化技术介绍 ……………………………………………………………… 122
6.1.1 Linux 虚拟网络设备 ………………………………………………………… 122
6.1.2 Linux 路由表 ………………………………………………………………… 124
6.1.3 Linux iptables ………………………………………………………………… 126
6.1.4 Go 语言网络库介绍 ………………………………………………………… 127
6.2 构建容器网络模型 ………………………………………………………………… 128
6.2.1 模型 ………………………………………………………………………… 128
6.2.2 调用关系 …………………………………………………………………… 130
6.3 容器地址分配 ……………………………………………………………………… 137
6.3.1 bitmap 算法介绍 …………………………………………………………… 138
6.3.2 数据结构定义 ……………………………………………………………… 138
6.3.3 地址分配的实现 …………………………………………………………… 140
6.3.4 地址释放的实现 …………………………………………………………… 142
6.3.5 测试 ………………………………………………………………………… 142
6.4 创建Bridge 网络 …………………………………………………………………… 144
6.4.1 Bridge Driver Create 实现 …………………………………………………… 144
6.4.2 Bridge Driver 初始化Linux Bridge 流程 …………………………………… 144
6.4.3 Bridge Driver Delete 实现 …………………………………………………… 148
6.4.4 测试 ………………………………………………………………………… 148
6.5 在Bridge 网络创建容器 …………………………………………………………… 149
6.5.1 挂载容器端点的流程 ……………………………………………………… 150
6.5.2 测试 ………………………………………………………………………… 156
6.6 容器跨主机网络 …………………………………………………………………… 159
6.6.1 跨主机容器网络的IPAM …………………………………………………… 160
6.6.2 跨主机容器网络通信的常见实现方式 …………………………………… 161
6.7 小结 ………………………………………………………………………………… 163
第7 章 高级实践……………………………………………………………………………… 164
7.1 使用mydocker 创建一个可访问的nginx 容器 …………………………………… 164
7.1.1 获取nginx tar 包 …………………………………………………………… 164
7.1.2 构建自己的nginx 镜像 ……………………………………………………… 165
7.1.3 运行mynginx 容器 ………………………………………………………… 167
7.2 使用mydocker 创建一个flask + redis 的计数器 ………………………………… 169
7.2.1 创建redis 容器 ……………………………………………………………… 169
7.2.2 制作flask 镜像 ……………………………………………………………… 173
7.2.3 创建myflask 容器 …………………………………………………………… 176
7.3 runC ………………………………………………………………………………… 177
7.3.1 简介 ………………………………………………………………………… 177
7.3.2 OCI 标准包(bundle) ……………………………………………………… 177
目录XV
7.3.3 config.json …………………………………………………………………… 178
7.3.4 mounts ……………………………………………………………………… 178
7.3.5 process ……………………………………………………………………… 179
7.3.6 user …………………………………………………………………………… 179
7.3.7 hostname …………………………………………………………………… 180
7.3.8 platform ……………………………………………………………………… 180
7.3.9 钩子(Hook) ……………………………………………………………… 181
7.4 runC 创建容器流程 ………………………………………………………………… 182
7.5 Docker containerd 项目介绍 ………………………………………………………… 186
7.5.1 架构 ………………………………………………………………………… 187
7.5.2 特性和路线图 ……………………………………………………………… 188
7.5.3 containerd 和Docker 之间的关系 ………………………………………… 188
7.5.4 containerd、OCI 和runC 之间的关系 ……………………………………… 188
7.5.5 containerd 和容器编排系统的关系 ………………………………………… 189
7.6 Kubernetes CRI 容器引擎 …………………………………………………………… 189
7.6.1 什么是CRI ………………………………………………………………… 189
7.6.2 为什么需要CRI …………………………………………………………… 193
7.6.3 为什么CRI 是接口且是基于容器的而不是基于Pod 的 ………………… 193
7.6.4 如何使用CRI ……………………………………………………………… 193
7.6.5 CRI 的目标 ………………………………………………………………… 194
7.6.6 已知的问题 ………………………………………………………………… 194
7.7 小结 ………………………………………………………………………………… 195
· · · · · · (收起)
读后感
这本书的出发点很有意思,这种类型的书我以前看过的一般都是写《xx内核解析》或者《深入理解xx》的标题和方式,但是这本书不一样,它是以《自动动手xx》来解析 Docker 的内核原理,我个人觉得还是很有新意的,而且可能对于读者来说对原理和内容的掌握和了解更有帮助。 从这本书...
这本书的出发点很有意思,这种类型的书我以前看过的一般都是写《xx内核解析》或者《深入理解xx》的标题和方式,但是这本书不一样,它是以《自动动手xx》来解析 Docker 的内核原理,我个人觉得还是很有新意的,而且可能对于读者来说对原理和内容的掌握和了解更有帮助。 从这本书...
这本书的出发点很有意思,这种类型的书我以前看过的一般都是写《xx内核解析》或者《深入理解xx》的标题和方式,但是这本书不一样,它是以《自动动手xx》来解析 Docker 的内核原理,我个人觉得还是很有新意的,而且可能对于读者来说对原理和内容的掌握和了解更有帮助。 从这本书...
这本书的出发点很有意思,这种类型的书我以前看过的一般都是写《xx内核解析》或者《深入理解xx》的标题和方式,但是这本书不一样,它是以《自动动手xx》来解析 Docker 的内核原理,我个人觉得还是很有新意的,而且可能对于读者来说对原理和内容的掌握和了解更有帮助。 从这本书...
这本书的出发点很有意思,这种类型的书我以前看过的一般都是写《xx内核解析》或者《深入理解xx》的标题和方式,但是这本书不一样,它是以《自动动手xx》来解析 Docker 的内核原理,我个人觉得还是很有新意的,而且可能对于读者来说对原理和内容的掌握和了解更有帮助。 从这本书...
用户评价
对于 Docker,我始终觉得它是一个非常强大的工具,但在实际应用中,如何才能更好地利用它来提升开发效率和运维能力,是我一直在探索的问题。这本书的名字“自己动手写 Docker”让我联想到,也许它不仅仅会讲解 Docker 的基础用法,还会涉及一些进阶的实践和技巧。我希望它能包含一些关于如何将 Docker 集成到 CI/CD 流程中的内容,比如如何利用 Docker 构建自动化测试环境,如何实现持续集成和持续部署。我还会关注书中是否能讲解如何使用 Docker 来构建微服务架构,以及如何处理微服务之间的依赖关系、通信和治理。例如,在讲到 CI/CD 的时候,我希望能看到如何结合 Jenkins、GitLab CI 等工具来自动化 Docker 镜像的构建、测试和部署。在讲到微服务的时候,我希望能看到如何利用 Docker Compose 或 Kubernetes 来管理复杂的微服务应用,以及如何实现服务注册、发现和负载均衡。如果书中能提供一些关于 Docker 安全的最佳实践,比如如何进行镜像扫描、漏洞检测、运行时安全监控等,那就更完美了。我期待通过这本书,能够将 Docker 的潜力发挥到极致,并且能够真正成为一名 Docker 专家,能够自信地解决各种复杂的开发和运维挑战。
一本关于 Docker 的书,听起来就让人跃跃欲试。我一直对容器化技术很感兴趣,但又觉得市面上很多书籍都过于理论化,或者只停留在表面,缺乏深度。我希望这本书能让我真正理解 Docker 的核心概念,比如镜像、容器、仓库、网络和存储等等,并且能够通过实际操作来巩固这些知识。我希望它不仅仅是告诉你“怎么做”,更能让你明白“为什么这么做”。例如,在讲到 Dockerfile 的时候,我希望能看到不同指令的详细解释,以及它们在构建镜像过程中的作用和影响。更重要的是,我期待这本书能引导我掌握如何有效地管理和编排复杂的容器化应用,比如通过 Docker Compose 来定义和运行多容器应用,以及如何处理容器间的通信和数据持久化。我还会关注书中是否包含了一些实际的应用场景和最佳实践,比如如何优化 Docker 镜像的大小,如何提高容器的安全性,以及如何在生产环境中部署和监控 Docker 应用。如果书中能提供一些实际项目中的案例分析,那就更好了,这样我可以更直观地学习如何在真实世界中使用 Docker 来解决问题。我希望能在这本书中找到解决实际问题的灵感和方法,并且能够自信地将 Docker 应用到我的开发和运维工作中。
我一直在寻找一本能够帮助我系统地学习 Docker 网络和存储知识的书籍。在实际使用 Docker 的过程中,我经常会遇到一些关于容器间通信、数据持久化以及网络访问的问题,而这些问题往往与 Docker 的网络和存储机制息息相关。我希望这本书能够详细讲解 Docker 的网络模型,包括桥接网络、主机网络、覆盖网络等,并且能够提供实际的配置和故障排除指南。我希望能理解容器是如何获得 IP 地址,如何进行 DNS 解析,以及如何实现容器间的端口映射和访问控制。在存储方面,我希望这本书能够深入讲解 Docker 的数据卷(Volumes)和绑定挂载(Bind Mounts)的工作原理,以及如何使用它们来持久化容器数据,实现数据共享,并且能够在容器生命周期结束后保留数据。我还会关注书中是否能介绍 Docker 的插件化架构,以及如何通过插件来扩展 Docker 的网络和存储功能。如果书中能包含一些关于如何优化 Docker 网络和存储性能的技巧,或者如何处理分布式存储场景下的挑战,那就更好了。我期待通过这本书,能够彻底解决我在 Docker 网络和存储方面遇到的所有难题,并且能够更灵活、更高效地使用 Docker。
这本书的名字听起来就很有吸引力,"自己动手写 Docker" 让人感觉充满挑战和乐趣。我一直对 Docker 的底层原理感到好奇,特别是它是如何实现隔离性,又是如何管理资源的。我希望这本书能够深入讲解 Docker 的核心组件,比如 Linux Namespace、Cgroups、UnionFS(如 OverlayFS)等,并且能够通过代码示例来展示这些技术的实现。我希望它能解释清楚 Docker 为什么能够做到轻量级和高性能,以及它与传统虚拟机相比的优势在哪里。例如,在讲解 Namespace 的时候,我希望能看到不同类型的 Namespace(PID、Network、Mount、UTS、IPC、User)的详细介绍,以及它们各自的作用。在讲解 Cgroups 的时候,我希望能看到如何使用 Cgroups 来限制容器的 CPU、内存、磁盘 I/O 等资源。我还会关注书中是否能讲解 Docker 的存储驱动是如何工作的,以及如何通过这些驱动来实现数据的持久化和共享。如果书中能提供一些关于如何从零开始构建一个简化版的 Docker 引擎的示例,那就更好了,这能让我对 Docker 的工作原理有一个更深刻的理解。我希望这本书能够满足我对 Docker 底层技术的求知欲,并且能够让我成为一个真正理解 Docker 的开发者。
我最近在寻找一本能够系统性地讲解 Docker 编排工具的书籍。虽然对 Docker 本身有了一些了解,但要构建和管理复杂的分布式系统,Docker Compose 和 Kubernetes 这样的工具是必不可少的。我希望这本书能够深入浅出地介绍 Docker Swarm 和 Kubernetes 的核心概念,比如服务、任务、节点、Pod、Deployment、Service 等等,并且能够提供详细的操作指南,让我能够一步步地搭建起自己的容器编排集群。我特别关注书中是否能讲解如何使用这些工具来部署、扩展和管理容器化应用,以及如何处理应用的高可用性和容错性。例如,在讲到 Kubernetes 的时候,我希望能看到关于 Pod 生命周期、ReplicaSet、Deployment、StatefulSet、DaemonSet 等控制器的工作原理和使用场景的详细解释。同时,我也希望书中能介绍如何进行服务发现、负载均衡、配置管理和秘密管理,以及如何实现容器的日志收集和监控。如果书中能包含一些实际的部署案例,比如如何部署一个 Web 应用、数据库或者消息队列,那就更完美了。我期待通过这本书,能够掌握容器编排的精髓,并且能够自信地在生产环境中部署和管理大规模的容器化应用。
加深对Docker和Linux的理解。。。
很好呀!我很喜欢这本书,深入浅出。值得多看几遍!
还行把,瞎jb看了一遍,自己动手终究不如友邻动手(口)
nice
原来都是使用linux下的虚拟化技术编写的