第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
· · · · · · (
收起)
1 有用 lix7 2022-06-29 14:25:26
很好很薄的一本小册子,按章介绍了容器依赖的namespace(限制可见性)和cgroup(限制配额)技术,然后基于两者实现了docker的基础命令docker run,随后补充了aufs实现(虽然已经弃用了,但overlay2在思想上是一样的)、cmd命令、网络等等特性。最后运行了原生的nginx docker镜像,作为成果展示。全书没有什么废话,全是干货。当看到namespace和cgroup以... 很好很薄的一本小册子,按章介绍了容器依赖的namespace(限制可见性)和cgroup(限制配额)技术,然后基于两者实现了docker的基础命令docker run,随后补充了aufs实现(虽然已经弃用了,但overlay2在思想上是一样的)、cmd命令、网络等等特性。最后运行了原生的nginx docker镜像,作为成果展示。全书没有什么废话,全是干货。当看到namespace和cgroup以代码形式一行一行构建起一个可用的容器时,才真正理解了docker是什么。 (展开)
0 有用 星座北斗 2022-01-25 10:17:59
细节极差
1 有用 软件园的猪 2019-04-21 12:07:14
学docker一方面是学习docker对devops的作用,docker是不可变部署物的最佳形式;另一方面是docker本身的技术,包括namespace隔离、cgroup资源管理、aufs文件系统、bridge网络、封包路由。这本书能够消除对docker技术的很多迷惑。
0 有用 撒旦的玩偶 2020-01-11 22:03:42
从此Docker不再那么神秘,一本可以和How Tomcat works媲美的好书。
4 有用 顾白 2018-09-04 18:24:58
对着书写了一遍,历时三个星期
0 有用 喜欢雨夜 2024-02-19 20:07:51 北京
以此入门了解docker的实现原理,简单明了,感谢好作品!
0 有用 在坡华子 2023-12-09 20:52:48 浙江
这不就golang文件操作+网络编程么
0 有用 木子 2023-10-30 14:17:15 上海
可以帮助加深熟悉docker的常用命令以及了解背后实现的具体步骤..也会帮助熟悉一些系统命令及go语言下对系统调用的相关代码
0 有用 夜想曲 2023-04-02 16:52:06 广东
容器运行离不开linux namespace与cgroup,以前只知道这个概念,但没见过相应的容器实现代码,也不知道具体是怎样的。读过这本书后,基本懂了。尤其第6章,写得不错,即使对linux网络虚拟化技术不了解,也能很好地读懂容器网络原理。 唯一不足的,就是过于简单,深度过浅,但作为面向go语言初学者或想了解容器大概原理的人来说,也是够了。
0 有用 WanliuRanger 2023-02-20 13:10:38 北京
虽然内容有些过时了,但还是非常好的入门书,跟着做一遍原理也就清楚了。