自己动手写Docker

陈显鹭 / 王炳燊 / 秦妤嘉

科技

编程

2017-7-1

电子工业出版社

目录
第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
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
【展开】
内容简介

本书在详细分析Docker所依赖的技术栈的基础上,一步一步地通过代码实例,让读者可以自己循序渐进地用Go语言构建出一个容器的引擎。不同于其他Docker原理介绍或代码剖析的书籍,本书旨在提供给读者一条动手路线,一步一步地实现Docker的隔离性,构建Docker的镜像、容器的生命周期及Docker的网络等。本书涉及的代码都托管在GitHub上,读者可以对照书中的步骤从代码层面学习构建流程,从而精通整个容器技术栈。本书也对目前业界容器技术的方向和实现做了简单介绍,以加深读者对容器生态的认识和理解。

本书适合对容器技术已经使用过或有一些了解,希望更深层次掌握容器技术原理和最佳实践的读者。

【展开】
下载说明

1、追日是作者栎年创作的原创作品,下载链接均为网友上传的的网盘链接!

2、相识电子书提供优质免费的txt、pdf等下载链接,所有电子书均为完整版!

下载链接
热门评论
  • 春你麻p晚的评论
    还行把,瞎jb看了一遍,自己动手终究不如友邻动手(口)
  • 顾白的评论
    对着书写了一遍,历时三个星期
  • hoterran的评论
    草草看完。 docker 自己的东西确实不多,所以拼命的搞 OCI , containerd 等标准。 最后也只能沦为标准。 对 linux namespace, cgroup 熟悉,可以很快写出一个 docker 这本书用 c ,代码会更好看。
  • 老C的评论
    挺好的,破解了很多神秘感。
  • codepiano的评论
    比较贴近具体实现,本来页数就少,大部分都是代码。原理方面讲了,不过不是特别详细。整体还不错
  • Jun的评论
    容器网络部分没有看,其他照着代码敲了
  • tallongsun的评论
    读一遍docker就没有什么神秘的了,ubuntu14下代码都可用,别的系统可能会有些许问题
  • 撒旦的玩偶的评论
    从此Docker不再那么神秘,一本可以和How Tomcat works媲美的好书。
  • zoking的评论
    看完自觉很有收获,但是想要用自己的话解释还是很困难。 不过,再用docker会有一种莫名的亲切感/熟悉感.
  • 软件园的猪的评论
    学docker一方面是学习docker对devops的作用,docker是不可变部署物的最佳形式;另一方面是docker本身的技术,包括namespace隔离、cgroup资源管理、aufs文件系统、bridge网络、封包路由。这本书能够消除对docker技术的很多迷惑。