docker使用的是C/S架构。docker client 通 docker Daemon进行交互。其中主要的工作是通过Daemon来完成,包括拉取进项、编译镜像、运行容器、发布容器等。
docker client和docker Daemon 可以运行在同一个系统上,也可以通过远程方式进行访问。docker client 和 docker Daemon之间是在Socket上通过 RESTful API 进行交互的。
1、docker Daemon
Docker Daemon 是Docker 最核心的后台进程,它负责响应来自docker client的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个API Server,负责接收由Docker client发送的请求;接收到的请求将通过docker daemon分发调度。再由具体的函数来执行请求。
docker Daemon运行在一个主机上,用户并不是直接同Docker Daemon进行交互,而是通过docker client进行访问。
2、docker client
docker client是一个泛称,用来向docker daemon发起请求,执行相应的容器管理操作。它既是命令行工具docker,也可以是任何遵循了Docker API的客户端。目前,社区中维护着的Docker client种类非常丰富。涵盖了 C#,Java,Go,Ruby,JavaScript等常用语言,甚至还有使用Angular库编写的WebUI格式的客户端,足以满足大多数用户的需求。
docker clinet 是主要的用户访问Docker的渠道。用户通过它对docker daemon进行访问控制。要查看client和deamon的信息,可以通过docker version命令进行查看。
3、从client到daemon
(1)、docker run命令开始运行,用户端的docker进入client模式。
(2)、经过初始化,新建出一个client对象。
(3)、上述client通过反射机制找到了CmdRun方法。CmdRun方法在解析用户提供的容器参数之后,最终发出了下面的两个请求:
"POST","/containers/create?"+containerValues //创建容器
"POST","/containers"+createResponse.ID+"/start" //启动容器
至此,client的主要任务结束。