标签:
本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1462527343
本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51333371
前面5篇简单的分析了下docker Daemon工作流程。
那么现在进入docker client模式
代码在docker\docker\flags.go
首先我们看看都提供了那些操作
通过flag.usage来看是最直接的了
从上面的init函数中,可以看出,提供的所有的command
我们进入main函数
docker\docker\docker.go
func main() {
main函数末尾,构造了一个dockerCli,然后调用了cli.Cmd
代码在docker\api\client\cli.go
一些参数的准备,然后构建了DockerCli结构体
我们看下dockerCli结构体
结构体的成员数量还是比较少的,相对比Daemon来说,要简洁多了
下面我们就看看Cmd怎么转换的
根据命令行的参数,进行获取,如果有问题则调用CmdHelp
这里可以看到,其实最后调用的是flag.Usage(),这个我们开篇的时候已经分析过了。
getMethod,是通过将在cmd前面加上“Cmd”,然后通过反射找到相对应的处理函数。
这里就是全部提供的Cmd所对应的处理函数。
下面我们看看Create命令
代码在docker\api\client\commands.go
首先解析了参数,获取到了config,hostconfig,cmd
然后调用了createContainer
将参数合并,然后调用了call,传入的为Method何path,还有编码方式
最后将返回的response进行解码,返回结果
代码在docker\api\client\utils.go
将数据进行编码,然后调用了clientRequest
代码在docker\api\client\utils.go
这里代码很简单,也很清晰,构建了一个httpRequest,然后设置了一些参数
接着就是利用httpclient来发起请求,获得到的数据则返回给上一级
dockerclient,代码量比较少,功能清晰。读取输入参数,通过发射查找到对应的cmdhandler,然后做一些相关的操作。最后通过调用call---》clientRequest---》httpclient与Daemon连接。
文中如果有哪里讲解的不对的地方,还请见谅,望指正。
龚浩华
QQ 月牙寂 29185807
2016年5月6日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
【原创】docker源码分析(6)---dockerclient
标签:
原文地址:http://blog.csdn.net/screscent/article/details/51333371