自己动手写Docker
出版时间:2017
内容简介
《自己动手写Docker》在详细分析Docker所依赖的技术栈的基础上,一步一步地通过代码实例,让读者可以自己循序渐进地用Go语言构建出一个容器的引擎。不同于其他Docker原理介绍或代码剖析的书籍,《自己动手写Docker》旨在提供给读者一条动手路线,一步一步地实现Docker的隔离性,构建Docker的镜像、容器的生命周期及Docker的网络等。《自己动手写Docker》涉及的代码都托管在GitHub上,读者可以对照书中的步骤从代码层面学习构建流程,从而精通整个容器技术栈。《自己动手写Docker》也对目前业界容器技术的方向和实现做了简单介绍,以加深读者对容器生态的认识和理解。 《自己动手写Docker》适合对容器技术已经使用过或有一些了解,希望更深层次掌握容器技术原理和至佳实践的读者。
目录
第1章容器与开发语言1
1.1Docker 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.2Go 5
1.2.1描述 5
1.2.2安装Go 6
1.2.3配置GOPATH 6
1.3小结 7
第2章基础技术8
2.1Linux Namespace 介绍 8
2.1.1概念 8
2.1.2UTS Namespace 10
2.1.3IPC Namespace 11
2.1.4PID Namespace 13
2.1.5Mount Namespace 14
2.1.6User Namespace 16
2.1.7Network Namespace 18
2.2Linux Cgroups介绍 20
2.2.1什么是Linux Cgroups 20
2.2.2Docker是如何使用Cgroups的 24
2.2.3用Go语言实现通过cgroup限制容器的资源 25
2.3Union File System 26
2.3.1什么是Union File System 26
2.3.2AUFS 27
2.3.3Docker是如何使用AUFS的 27
2.3.4自己动手写AUFS34
2.4小结 37
第3章构造容器38
3.1构造实现run命令版本的容器 38
3.1.1Linux 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.1busybox 59
4.1.2pivot_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.1setns 94
5.4.2Cgo 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.1Linux虚拟网络设备 122
6.1.2Linux路由表 124
6.1.3Linux iptables 126
6.1.4Go语言网络库介绍 127
6.2构建容器网络模型 128
6.2.1模型 128
6.2.2调用关系 130
6.3容器地址分配 137
6.3.1bitmap算法介绍 138
6.3.2数据结构定义 138
6.3.3地址分配的实现 140
6.3.4地址释放的实现 142
6.3.5测试 142
6.4创建Bridge网络 144
6.4.1Bridge Driver Create实现 144
6.4.2Bridge Driver初始化Linux Bridge流程 144
6.4.3Bridge 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 创建一个??sk + redis的计数器 169
7.2.1创建redis容器 169
7.2.2制作??sk镜像 173
7.2.3创建my??sk容器 176
7.3runC 177
7.3.1简介 177
7.3.2OCI 标准包(bundle) 177
7.3.3con??.json 178
7.3.4mounts 178
7.3.5process 179
7.3.6user 179
7.3.7hostname 180
7.3.8platform 180
7.3.9钩子(Hook) 181
7.4runC 创建容器流程 182
7.5Docker containerd 项目介绍 186
7.5.1架构 187
7.5.2特性和路线图 188
7.5.3containerd和Docker 之间的关系 188
7.5.4containerd、OCI和runC之间的关系 188
7.5.5containerd和容器编排系统的关系 189
7.6Kubernetes 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.5CRI的目标 194
7.6.6已知的问题 194
7.7小结 195