Job的运行过程中 , 当需要容器镜像时 , 则从Docker Registry中下载镜像 , 并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时 , 通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时 , 则通过execdriver来完成 。
而libcontainer是一项独立的容器管理包 , networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作 。当执行完运行容器的命令后 , 一个实际的Docker容器就处于运行状态 , 该容器拥有独立的文件系统 , 独立并且安全的运行环境等 。
3、docker架构3
再来看看另外一个架构 , 这个个架构就简单清晰指明了server/client交互 , 容器和镜像、数据之间的一些联系 。
文章插图
这个架构图更加清晰了架构
docker daemon就是docker的守护进程即server端 , 可以是远程的 , 也可以是本地的 , 这个不是C/S架构吗 , 客户端Docker client 是通过rest api进行通信 。
docker cli 用来管理容器和镜像 , 客户端提供一个只读镜像 , 然后通过镜像可以创建多个容器 , 这些容器可以只是一个RFS(Root file system根文件系统) , 也可以ishi一个包含了用户应用的RFS , 容器再docker client中只是要给进程 , 两个进程之间互不可见 。
用户不能与server直接交互 , 但可以通过与容器这个桥梁来交互 , 由于是操作系统级别的虚拟技术 , 中间的损耗几乎可以不计 。
三、docker架构2各个模块的功能(带完善)主要的模块有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container 。
1、docker client
docker client 是docker架构中用户用来和docker daemon建立通信的客户端 , 用户使用的可执行文件为docker , 通过docker命令行工具可以发起众多管理container的请求 。
docker client可以通过一下三宗方式和docker daemon建立通信:tcp://host:port;unix:path_to_socket;fd://socketfd 。 , docker client可以通过设置命令行flag参数的形式设置安全传输层协议(TLS)的有关参数 , 保证传输的安全性 。
docker client发送容器管理请求后 , 由docker daemon接受并处理请求 , 当docker client 接收到返回的请求相应并简单处理后 , docker client 一次完整的生命周期就结束了 , 当需要继续发送容器管理请求时 , 用户必须再次通过docker可以执行文件创建docker client 。
2、docker daemon
docker daemon 是docker架构中一个常驻在后台的系统进程 , 功能是:接收处理docker client发送的请求 。该守护进程在后台启动一个server , server负载接受docker client发送的请求;接受请求后 , server通过路由与分发调度 , 找到相应的handler来执行请求 。
docker daemon启动所使用的可执行文件也为docker , 与docker client启动所使用的可执行文件docker相同 , 在docker命令执行时 , 通过传入的参数来判别docker daemon与docker client 。
docker daemon的架构可以分为:docker server、engine、job 。daemon
3、docker server
docker server在docker架构中时专门服务于docker client的server , 该server的功能时:接受并调度分发docker client发送的请求 , 架构图如下:
文章插图
在Docker的启动过程中 , 通过包gorilla/mux(golang的类库解析) , 创建了一个mux.Router , 提供请求的路由功能 。在Golang中 , gorilla/mux是一个强大的URL路由器以及调度分发器 。该mux.Router中添加了众多的路由项 , 每一个路由项由HTTP请求方法(PUT、POST、GET或DELETE)、URL、Handler三部分组成 。
若Docker Client通过HTTP的形式访问Docker Daemon , 创建完mux.Router之后 , Docker将Server的监听地址以及mux.Router作为参数 , 创建一个httpSrv=http.Server{} , 最终执行httpSrv.Serve()为请求服务 。
在Server的服务过程中 , Server在listener上接受Docker Client的访问请求 , 并创建一个全新的goroutine来服务该请求 。在goroutine中 , 首先读取请求内容 , 然后做解析工作 , 接着找到相应的路由项 , 随后调用相应的Handler来处理该请求 , 最后Handler处理完请求之后回复该请求 。
推荐阅读
- 浅谈机油的那些事,手把手教您选择最合适的机油
- 学会这4点,你也能拥有人人羡慕的逻辑思维能力
- 普洱茶疯子杨旭,把天然健康的普洱美茶带给全世界
- 乳胶漆墙面如何去污,怎么把墙上面的乳胶漆处理下来
- 电视剧里"徒手劈脖子"一招就晕是真是假?多年的疑问终于解开了
- 杭州,茶都专家重阳茶会把脉遂昌茶产业发展
- 《茶的国度》_茶叶这把绿色的双刃剑,是如何影响大唐王朝的_
- 五分钟搞定 HTTPS 配置,手把手教
- 做人,不要把别人的善良当作傻,不要把别人的谦虚看成笨
- “工作中总有人故意找茬,怎么办?”