Docker源码分析
上QQ阅读APP看书,第一时间看更新

2.2.3 如何创建Docker Client

Docker Client的创建其实就是在已有配置参数信息的情况下,通过Client包中的NewDockerCli方法创建一个Docker Clinet实例cli。具体源码实现如下:

if *flTls || *flTlsVerify {
          cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], &tlsConfig)
} else {
          cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], nil)
     }

若flag参数flTls为真或者flTlsVerify为真,则说明需要使用TLS协议来保障传输的安全性,故创建Docker Client的时候,将tlsConfig参数传入;否则,同样创建Docker Client,只不过tlsConfig为nil。

关于Client包中的NewDockerCli函数的实现,可以具体参见./docker/api/client/cli.go。

func NewDockerCli(in io.ReadCloser, out, err io.Writer, proto, addr string, tlsConfig *tls.Config) *DockerCli {
var (
     isTerminal = false
     terminalFd uintptr
     scheme     = "http"
)

if tlsConfig != nil {
     scheme = "https"
}

if in != nil {
     if file, ok := out.(*os.File); ok {
          terminalFd = file.Fd()
          isTerminal = term.IsTerminal(terminalFd)
     }
}

if err == nil {
     err = out
}
return &DockerCli{
     proto:      proto,
     addr:       addr,
     in:         in,
     out:        out,
     err:        err,
     isTerminal: isTerminal,
     terminalFd: terminalFd,
     tlsConfig:  tlsConfig,
     scheme:     scheme,
     }
}

总体而言,创建DockerCli对象的过程比较简单。较为重要的DockerCli的属性有:proto,DockerClient与Docker Server的传输协议;addr,Docker Client需要访问的host目标地址;tlsConfig,安全传输层协议的配置。若tlsConfig不为空,则说明需要使用安全传输层协议,DockerCli对象的scheme设置为“https”,另外还有关于输入、输出以及错误显示的配置等。最终函数返回DockerCli对象。

通过调用client包中的NewDockerCli函数,程序最终创建了Docker Client,返回main包中的main函数之后,程序继续往下执行。