本节书摘来华章计算机《容器技术系列》一书中的第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请求。