- Docker源碼分析
- 孫宏亮
- 431字
- 2018-12-31 20:27:03
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函數之后,程序繼續往下執行。