先看看上次没看完的client的初始化。
NewAPIClientFromFlags里
getServerHost(opts.Hosts, opts.TLSOptions),如果参数有指定用参数的,如果没指定用os.Getenv("DOCKER_HOST").
设置customHeaders,环境变量如果有设置DOCKER_API_VERSION,设置api版本
newHTTPClient(host, opts.TLSOptions)返回一个http.client
client.NewClient(host, verStr, httpClient, customHeaders)初始化一个新的Client对象,Client是啥,
client/interface_stable.go
package client
// APIClient is an interface that clients that talk with a docker server must implement.
type APIClient interface {
CommonAPIClient
apiClientExperimental
}
// Ensure that Client always implements APIClient.
var _ APIClient = &Client{}
APIClient是个接口类型,看了一下包含了好多函数,应该是所有命令集中都是调的这里的。Client就是一个APIClient接口类型的实现。这样写一句应该能保证,不然编译不过,哈哈 会玩。。
client的命令都是在上一篇的AddCommands里边集中添加,对应各个目录里边的cmd.go里的NewCommand方法进行添加。
client.Ping( 在client/ping.go里,
先req, err := cli.buildRequest("GET", fmt.Sprintf("%s/_ping", cli.basePath), nil, nil),构造请求
serverResp, err := cli.doRequest(ctx, req),发送请求返回结果,都在request.go里边,普通的http请求。
然后ping.APIVersion和ping.Experimental都是根据返回的header来判断的,Experimental具体干啥的还不清楚
client.UpdateClientVersion,这个仅仅是改了一下client的版本,可能请求是带上这个版本,服务端会根据这个版本进行不同操作返回吧。还不确定。cli.version = v
这个样整个dockerCli就初始化完了。核心就是那个Client,各种请求的定义都在里边。
再看看具体命令的执行,看个docker info命令,感觉这个应该简单点。
system.NewSystemCommand(dockerCli),
system.NewVersionCommand(dockerCli),
正好还有个version,先看看这个。在runVersion(里边,
ctx := context.Background()
先创建一个空context,versionTemplate 格式化模板,如果提供opts.format参数,就使用提供的模板。上边有这个操作
APIVersion := dockerCli.Client().ClientVersion()
这里找了一下Client()返回dockerCli.client就是上边提到的初始化的那个,client.APIClient类型的
ClientVersion() 在client/client.go里边定义:func (cli *Client) ClientVersion() string返回Client .version字段。也和之前的一样
下边就是版本不统一,api版本低的话会让cli的版本也低,然后会跟随打印出来。api版本高的话,可能兼容的,这个也不确定。
dockerCli.Client().ServerVersion(ctx)然后请求server的版本。cli.get(ctx, "/version", nil, nil)走接口请求.
最后就是渲染模板,进行打印。
types 都在api/types定义的。可能会公用到吧,不太清楚。
总的来说就是client解析参数,然后找到对应的处理方法,发送请求给server,然后server返回。这个和官方提供的api是用的一样的。我记得之前搭建docker环境的时候踩过一个坑,配置api的访问接口的时候,把socket给去掉了,只留个ip:port的,本地命令就没法执行了。本地默认好像走的socket文件的。
其他client端的命令就不看了 ,应该都是一样的。下边就看看server的。
上一篇: mac os 升级sierra
下一篇: Docker源码阅读4-daemon流程
0 Responses so far.