Docker源码阅读3-client命令

先看看上次没看完的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的。

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply