天天看点

《容器技术系列》一2.3 Docker命令执行

本节书摘来华章计算机《容器技术系列》一书中的第2章 ,第2.3节,孙宏亮 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

main函数执行到这个阶段,有以下内容需要为docker命令的执行服务:创建完毕的docker client,docker命令中的请求参数(经flag解析后存放于flag.arg())。也就是说,程序需要使用docker client来分析docker命令中的请求参数,得出请求的类型,转义为docker server可以识别的请求之后,最终发送给docker server。

docker client主要完成两方面的工作:解析请求命令,得出请求类型;执行具体类型的请求。本节将从这两个方面深入分析docker client。

docker client解析请求命令的工作,在docker命令执行部分第一个完成。创建docker client之后,回到main函数中,继续执行的源码如下(位于./do<code>`</code>javascript

cker/docker/docker.go#l102-l110):

if err := cli.cmd(flag.args()...); err != nil {

}

// cmd executes the specified command

func (cli *dockercli) cmd(args ...string) error {

cmd := cli.subcmd("pull", "name[:tag]", "pull an image or a repository from the registry")

tag := cmd.string([]string{"#t", "#-tag"}, "", "download tagged image in a repository")

if err := cmd.parse(args); err != nil {

if cmd.narg() != 1 {

var (

)

v.set("fromimage", remote)

if *tag == "" {

remote, _ = parsers.parserepositorytag(remote)

// resolve the repository name from fqn to hostname + name

hostname, _, err := registry.resolverepositoryname(remote)

if err != nil {

通过cli对象获取与docker server通信所需要的认证配置信息。

定义一个名为pull的函数,传入的参数类型为registry.authconfig,返回类型为error。函数执行块中最主要的内容为:cli.stream(……)部分。该部分具体向docker server发送post请求,请求的url为"/images/create?"+v.encode(),请求的认证信息为:

由于上一个步骤只是定义pull函数,这一步骤具体调用执行pull函数,实现实际意义上的下载请求发送。若返回成功则表明请求完成,程序直接退出,若返回错误,则做相应的错误处理。若返回错误为401,则表示用户下载的镜像必须用户先登录,随即docker client转至登录环节,完成之后,继续执行pull函数,若完成则最终返回。

以上便是pull请求的全部执行过程,其他请求的执行在流程上也是大同小异。总之,请求执行过程中,大多都是将命令行中关于请求的参数进行初步处理,并添加相应的辅助信息,最终通过指定的协议向docker server发送docker client和docker server约定好的api请求。

继续阅读