说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
前面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连接。
文中如果有哪里讲解的不对的地方,还请见谅,望指正。