这张图展示了Docker客户端、服务端和Docker仓库(即Docker Hub和Docker Cloud ),默认情况下Docker会在Docker中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于Git,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。
Docker采用的是C/S架构,客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远程的服务器通信。
1、Docker Client
Docker客户端其实就是Docker提供命令行界面工具,是许多Docker 用户与Docker 进行交互的主要方式。客户端可以构建、运行和停止应用程序,还可以远程与Docker_HOST进行交互。 最常用的Docker客户端就是Docker命令,我们可以通过Docker命令很方便地在host上构建和运行Docker容器。
2、Docker Daemon
Docker Daemon是服务器组件,以Linux后台服务的方式运行,是Docker最核心的后台进程,我们也把它称为守护进程。它负责相应来自Docker Client的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个API Server,负责接收由Docker Client发送的请求,接收到的请求将通过Docker Daemon内部的一个路由分发调用,由具体的函数来执行请求。
Docker Daemon的架构如下所示:
Docker Daemon可以认为是通过Docker Server模块接受Docker Client的请求,并在Engine中处理请求,然后根据请求类型,创建出指定的Job并运行。Docker Daemon运行在Docker Host上,负责创建、运行、监控容器,构建、存储镜像。
运行过程的作用有以下几种可能:
-
向Docker Registry获取镜像
-
通过grapthdriver执行容器镜像的本地化操作
-
通过networkdriver执行容器网络环境的配置
-
通过execdriver执行容器内部运行的执行工作
由于Docker Daemon和Docker Client的启动都是通过可执行文件Docker来完成的,因此两者的启动流程非常相似。Docker可执行文件运行时,运行代码通过不同的命令行flag参数,区分两者,并最终运行两者各自相应的部分。
启动Docker Daemon时,一般可以使用一下命令来完成
docker --daemon = true
docker –d
docker –d = true
再由docker的main函数来解析以上命令的相应的flag参数,并最终完成Docker D