client 模式
docker命令对应的源文件是docker/docker.go,
docker [options] command [arg...]
其中options参数为flag,任何时候执行一个命令docker命令都需要先解析flag,然后按照用户生命的command向指定的子命令执行对应的操作
如果子命令为daemom,docker都会创建一个运行在宿主机上的daemom进程,即执行daemom模式。其余子命令都会执行client模式。处于client模式命令工作流程包含几个步骤
1.解析flag信息
docker命令支持大量的option,或者说flag,列出对于client模式下的docker比较重要的一些flag
Debug,对应-D和--debug参数,他将向系统中添加DEBUG环境变量且赋值为1,并把日志显示级别调为DEBUG级,这个flag用于启动调试模式
LogLevel,对应-l和--log-level 参数。默认等级为info,即只输出普通的操作信息。用户可以指定的日志等级现在有panic、fatal、error、warn、info、DEBUG这几种
hosts,对应-h和--hosts=[]参数,对于client模式,就是指本次操作需要连接的docker daemom位置,而对于daemom模式,则提供所要监听的地址,若host变量或者系统环境变量DOCKER_HOST不为空,说明用户指定了host对象;否则使用默认设置,默认情况下Linux系统设置为unix:///var/run/docker.sock
protAddrParts,这个参数来自-H参数中://前后的两部分的组合,即与docker daemom建立通信的协议方式与socke地址
2创建client实例
client的创建就是在已有配置参数信息的基础上,调用api/client/cli.go#NewDockerCli,需要设置好proto(传输协议)、addr(host的目标地址)和tlsConfig(安全传输层协议的配置),另外还会配置标准输入输出及错误输出
3执行具体的命令
Docker client 对象创建成功后,剩下的执行具体命令的过程就交给cli/cli.go来处理
从命令到映射的方法
cli主要通过反射机制,从用户输入的命令(如run)得到匹配的执行方法(CmdRun),这就是所谓“约定大于配置”的方法命名规范。
同时,cli会根据参数列表的长度判断是否用于多级docker命令支持