Docker Client源码分析(一)

 

主要内容:

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路由到相应的的HandlerHandler便会创建一个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针对相同需求的不同实现的例子,简单查看过后,便可以进行接下来的阅读。

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信