Docker客户端用http协议发送请求给router,router接收的请求包里的内容。传送给handler分发请求给engine(引擎),而在engine里包含了多个job,通过操纵job管理。
Job:是负责工作的,每一个job用来做某一件事。当请求中,容器所需的镜像本地没有,就从外网容器仓库下载,比如hub.docker.com | daocloud.io | aliyun.com。
当job拿到镜像之后通过驱动将下载的镜像放到graph里,graph里面包数据库,镜像的存放位置。
当需要创建网络环境时,将会从engine里新建一个job通过网络驱动分配网卡、接口、ip、dns等连接到libcontainer下,进入到容器下。而libcontainer(容器库文件)提供了标准的接口,满足容器的操控。
最后就需要对docker容器操作 通过execdrive来创建namespace、cgroup。执行驱动也是通过libcontainer实现具体对容器进行的操作。
此时执行运行容器时,该容器就永远独立文件系统,安全环境。
rootfs则包含了一般系统上的常见目录结构,包含典型的目录结构,包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp 等再加上要运行用户应用所需要的所有配置文件,二进制文件和库文件。这个文件系统在不同的Linux 发行版中是不同的。而且用户可以对这个文件进行修改
bootfs包含了bootloader和linux内核。用户是不能对这层作任何修改的。在内核启动之后,bootfs实际上会unmount掉。
Docker整体框架结构:
Docker是由client和server的分离的状态组成
Docker client下达命令(docker run,docker start)给服务端。
Docker服务端
1 docker daemon包括两部分,一个是引擎部分,一个服务部分。
服务部分(docker server):处理客户端发送过来的请求,http server(接待访问的)route(处理客户端请求)header(把请求分发给job),由上到下执行
Engine(引擎)所有的工作都由engine的调度,支配engine生成多个job(线程),一个job可以创建一个新的容器,job会向registry请求镜像,registry把镜像交给job
Docker client:发送请求给docker daemon
Docker daemon:常驻后台,用来接收与处理客户端发来的请求。
Docker server:路由与分发调度,接收指令使用http协议
http server:接待访问的时候,docker采用的协议
Route:路由(指令发送给哪个容器)
Handler:分发请求(请求的类型(打开,运行,创建))
Engine(CE/EE):开启大量job,执行docker内一系列工作
Job:真正负责工作的工作单元(工作线程,每当有数据请求,就会形成一个job)
当容器所需镜像不在本地时会上网自动抓取。
Docker registry:外网容器仓库,比如hub.docker.com/daocloud.io/aliyun.com
Graph:本地下载镜像的保管者
GraphDB:存储层级关系
Repository(images):存储具体镜像的内容
Driver
Graph driver:存储驱动,ubuntu中是aufs,centos中是overlay2
Network driver:网络驱动,创建IP地址、端口号等,bridge-docker0
Exec driver:限制docker容器资源
Libcontainer(容器库文件):提供标准的接口,满足容器的操控。通过networkdriver连接到netlink。
Rootfs:不同的系统空间目录结构是不同的,busybox欺骗层网络驱动(networkdriver)包含interface(容器之间的通信)和bridge
Docker client和docker daemon之间建立通信,client并发送请求给daemon。而docker daemon作为docker架构中的主体部分,首先提供server的功能使其可以接受docker client的请求;而后engine执行docker内部的一系列工作,每一项工作都是以一个job的形式的存在。Docker daemon需要完成的任务很多,因此job的种类也很多。
Job的运行过程中,当需要容器镜像时,则从docker registry中下载镜像,并通过镜像管理驱动graph driver将下载镜像以graph的形式存储到graphDB(数据库)中;当需要为docker创建网络环境时,通过网络管理驱动network driver创建并设置docker容器网络环境;当需要限制docker容器时,则通过execdriver来创建namespace和cgroup来完成。
而lib container是容器库文件,network driver以及exec driver都是通过lib container来实现具体对容器进行的操作。Lib container是一套独立的容器管理解决方案,这套解决方案涉及了大量linux内核方面的特性,如:namespace、cgroups以及capabilities等。Libcontainer很好地抽象了linux的内核特性,并提供完整、明确的接口给docker daemon
当执行完运行容器的命令后,一个实际的docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。