想自己动手写Docker?你需要看《自己动手写Docker》这本书!
《自己动手写Docker》在详细分析Docker所依赖的技术栈的基础上,一步一步地通过代码实例,让读者可以自己循序渐进地用Go语言构建出一个容器的引擎。不同于其他Docker原理介绍或代码剖析的书籍,《自己动手写Docker》旨在提供给读者一条动手路线,一步一步地实现Docker的隔离性,构建Docker的镜像、容器的生命周期及Docker的网络等。
作者简介
(点击作者姓名可查看个人主页)
陈显鹭(花名:遥鹭)-阿里云高级研发工程师
对Docker有深入研究,是Docker多个项目的Contributor,专注于容器技术的编排与基础环境研究。爱好折腾源代码,热爱开源文化并积极参与社区开源项目的研发。
王炳燊(花名:溪恒)-阿里云研发工程师
具有丰富的Linux开发经验,对Docker有深入研究,多次提交Docker Patch。目前从事阿里云容器服务网络方案的设计与实现,专注于容器技术的基础环境研究。
秦妤嘉(花名:嫀嫀)-阿里云高级研发工程师
DevOps工程师,有丰富的容器化持续集成和持续交付开发实战经验,进行过Jenkins源码分析改造和Jenkins插件开发。目前从事阿里云容器服务持续集成和持续交付方案的设计和实现。
为什么要写这本书
Docker 技术可谓是近年最火热的技术之一,铺天盖地的技术论坛和各种讲座,大家都在分享关于如何容器化及如何使用Docker优化自己运维和开发流程的经验。随着Docker技术的逐渐普及,使用Docker已经不再是一个难题。现在更加重要的是生产环境容器化的最佳实践,另外就是容器的编排框架之争。但是,对于技术人员来说,除去Docker 外表的繁华外,什么是容器,容器到底是怎么创建的,容器底层的技术探秘也是非常重要的。
2014年开始接触 Docker的时候,经历了从最初的新奇—感叹竟然还有Docker 这样的好工具,到逐渐熟悉Docker的各种功能,尝试在生产环境中使用Docker技术的过程。但是,每每被人问到:“Docker技术到底是怎么实现的呢?”我只能粗粗浅浅地说:“Docker是使用Linux Kernel的Namespace 和 Cgroups实现的一种容器技术。”那么,什么是Namespace,什么是Cgroups,Docker是怎么使用它们的,容器到底是怎么一步步被创建出来的?问到这些,我就会支支吾吾地不知所以。由此可见,了解容器技术的底层技术,然后明白它们是如何工作的,尤为重要,这些才是整个容器技术的基石,掌握了这些基石才能更加容易地向上攀登。
单单讲解底层的技术实现细节和源码解读是很枯燥的一件事,一般来说很难有耐心去一点点细读然后揣摩其中的奥妙,这样囫囵吞枣地过一遍技术细节,作用不大。因此,便萌生了写一本《自己动手写Docker》这样的书的想法。本书不去刻意讲解容器技术的细节,用到什么讲解什么,点到为止,更加细节的内容留给读者自己探索。通过阅读本书,可以一步步地去了解容器技术的实现细节,更可以跟着作者一步步地用自己的代码去实现它。本书最大的乐趣莫过于用自己最新了解到的知识去动手实现自己的容器。由此可以进一步打开你进入容器技术社区的大门。
本书的内容
本书的目的是去引导读者通过学习容器技术的实现细节,一步步去构建一个简单的容器。 从这个过程中,了解整个容器技术领域和实现细节。本书注重原理的讲解与实践,每一部分都 会有详细的代码解析,力争用最少最精简的代码,帮助读者构建自己的容器。
本书的内容主要分为“容器与开发语言” “基础技术” “构造容器” “构造镜像” “构造 容器进阶” “容器网络” “高级实践” 这7章。
-
容器与开发语言:主要介绍 Docker 的基本功能和特点,并且对后面即将使用的 Go 语言 做一个简单的介绍。
-
基础技术:主要介绍实现容器的底层技术,如Namespace、Cgroups、Union File System。 每一小节都会有文字性介绍,并且附有一个简短的小例子程序,介绍在容器上是如何使 用这项技术的,方便读者清晰地理解各个技术点在容器上的作用。
-
构造容器:使用前面两章介绍的基础技术,构造一个最简单的容器环境,会将整体实现 细节及代码解析一点点展现,直接使用前面介绍的基础技术,从而更加有实战感。
-
构造镜像: 使用 2.3 节介绍的分层文件系统技术,构建一个简单的容器镜像,体现容器 镜像的分层思想。
-
构造容器进阶:更加贴近真实的容器实现,在原来的基础上,增加更丰富的功能。通过 这一章的学习,读者可以更好地了解各种技术是如何整合在一起,去实现容器整体功能 的。
-
容器网络: 除了实现一个容器环境之外,这一章还会讲解如何使自己的容器和宿主机通 信,以及如何让不同的容器之间进行通信,更加贴近真实环境。
-
高级实践: 使用自己编写的容器,运行一些通用程序,验证容器的可用性。此外,本章 还介绍了目前Docker 使用的容器运行引擎,以及目前容器运行态引擎的概况。
目录
第1章 容器与开发语言1
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
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 自己动手写AUFS34
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 创建一个flsk + redis的计数器 169
7.2.1 创建redis容器 169
7.2.2 制作flsk镜像 173
7.2.3 创建myflsk容器 176
7.3 runC 177
7.3.1 简介 177
7.3.2 OCI 标准包(bundle) 177
7.3.3 confi.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
需要的小伙伴,扫描下方公众号二维码,关注公众号
回复关键字:dzsn-dsdocker 即可免费无套路获取激活码、破解补丁,持续更新中~。