主要内容:
Docker Client在Docker中的定位,以及Docker Client源码的初步分析。
本文选取Docker拆分为DockerCE(社区版)和DockerEE(企业版)之后的Docker-CE的第一个稳定版本v17.06.0-ce。
https://github.com/docker/docker-ce
Docker背景:
Docker Client是绝大部分用户使用Docker的入口,例如一次docker pull请求,需要经过很多层调用,如下图:

Client创建一个docker pull的请求,发送给Deamon的http server,server接受之后通过Router路由到相应的的Handler, Handler便会创建一个PostImageCreate的Job交给Engine执行(不同的Job功能不同,需要的底层功能也不同), 该Job会先去Docker Registory拉取镜像,之后交给Graph Dirver,Graph Dirver再将镜像存储到本地的roootfs中。 上述过程中,我们发现Client不做任何的操作,而是构建请求,发送给Deamon执行。
那么我们会想,如果绕过Client,是否也可以向Deamon发送请求呢?答案是可以的,如下图:
Client可以访问Deamon的API,那么用户也可以直接访问Deamon的API,而且为了方便二次开发,Docker同时提供了很多语言的SDK供开发者选择,例如Docker Client for python。 下面我们正式进入Client。
Docker Client为什么选择了golang?
这个问题其实准确的说是“为什么Docker会选择golang来开发”,go有很多优点,下面我们细数一下
- python的那种简洁
- 行末不强制分号
- 支持多值返回
- c的那种高效
- 编译性语言
- 保留指针(被称为21世纪的C语言)
- 极少的运行时依赖(部署简单)
- java的那种安全
- 内存管理(垃圾回收)
- 语言层面支持并发
- 关键字支持:go select chan
博主认为Docker创建之初,最重要的一点是部署简单,运行时依赖极少,仅仅依赖glibc,它是linux最底层的API,几乎其他任何库都会依赖于glibc。Docker是部署到用户的机器上的,最重要的是通用性,所以运行时依赖越少越好。此些恰恰原因也是Docker Client使用golang开发的主要原因。
有的读者会想,我没学习过golang,会不会影响我学习Docker Client源码?其实语言只是一种工具,编程语言大同小异,简单看看语法,就能够阅读个大概,博主写了一些Java于golang针对相同需求的不同实现的例子,简单查看过后,便可以进行接下来的阅读。
