1、 docker总体架构
docker是一个client+server的架构,所有命令通过RESTful API接口交互传递。
Docker后端是松耦合的结构,各模块各司其职,有机组合。整个架构中daemon是常驻后台运行的进程,接受客户端请求并管理docker容器。Client是命令行终端,包装命令发送api请求,engine是真正处理客户端请求的后端程序。
1、 docker client和darmon建立通信,client发送请求给damon
2、 daemon作为主体部分,提供server功能,能让其接受client的请求
3、 engine执行处理内部的一系列工作
4、每个工作是一个job形式存在,需要镜像时,从docker registry中下载,通过graphdrive镜像管理驱动下载镜像并存储(Graph形式)
5、networkdrive负责创建配置容器的网络
6、运行用户指令或者限制容器资源时,通过execdrive完成
7、execdrive以及networkdrive通过libcontainer具体实现
2、 各模块组件分析
Docker client发起请求
与docker daemon建立通信的客户端,使用docker命令后接参数形式完成一个完整请求(发送请求-处理请求-返回结果)
建立通信方式:tcp://host:port、 unix://path_to_socket 、fd://socketfd
Docker daemon 守护进程
Docker server 调度分发请求
接受请求之后,通过路由分发调度,找到对应的handler执行请求,启动过程中,是通过gorilla/mux,创建一个mux.Router,提供请求的路由功能。(gorilla/mux在golang是一个强大的url路由器以及调度分发器),然后将server的监听地址和router作为参数创建一个httpsrv.server()为请求服务,在srv服务过程中,创建一个goroutine读取路由,解析之后,找到相应路由项,调用相应的handler处理该请求,处理完成之后回复该请求
Engine
运行引擎、运行的和兴模块,扮演的是docker container存储仓库的角色,通过job方式管理容器
Job
docker Engine内部最基本的工作执行单位,每一项工作抽象为一个job
docker registry
是一个存储容器镜像的仓库,在运行过程中与registry通信,实现搜索、下载、上传镜像的工作,对应job名称:search、pull、push(可分为公有和私有仓库)
Graph
内部数据库
Repository
镜像保管者(下载和构建的)
存储类型有aufs、devicemapper、Btrfs、Vfs,centos中使用devicemapper存储类型
GraphDB
容器镜像关系记录者
构建在SQLIte之上得到小型图数据库,实现节点命名以及节点之间关联关系的记录。
Drive
驱动模块,通过driver实现对容器执行环境的定制
Graphdrive
主要用于完成容器镜像的管理例如存储获取
Pull下载的镜像由graphdrive存储到本地graph获取镜像,也由graphdriver到本地Graph获取镜像
Networkdriver
启动时为docker环境创建网桥,容器创建时创建虚拟网卡、容器分配ip、端口与宿主机做端口映射、设置容器防火墙观策略
Execdriver
作为容器的执行驱动,创建命名空间,负责资源统计限制,负责进程运行、默认使用native驱动
Libcontainer
使用go语言设计实现的库,不依靠任何依赖,直接访问内核中容器相关的API
Docker可以直接调用libcontainer,来操作容器namespace、cgroups、apparmor、网络等