docker的架构解读
- docker的内部构建
- docker镜像(images)
- docker容器(container)
- docker仓库(repository)
- docker架构详解
- Docker Client
- Docker Daemon
- Docker Server
- Engine
- Job
- Docker Registry
- Graph
- Driver
- graphdriver
- networkdriver
- execdriver
- libcontainer
- docker container
- rootfs
- bootfs
docker的内部构建
docker镜像(images)
- 定义:是一个只读的模板,可以用来创建docker容器,可从外网:hub.docker.com;国内:developer.aliyun.com;查找镜像
docker容器(container)
- 定义:docker利用容器来运行应用,容器是从镜像创建的运行实例;每个容器都是相互隔离的,保证安全的平台。可以把容器看作一个简易的linux环境。
- 镜像是只读的,容器在启动的时候创建一层可写层作为最上层;容器的生命周期取决于容器指令的生命周期。
docker仓库(repository)
- 定义:是集中存放镜像文件的场所。仓库分为公开仓库和私有仓库两种形式。
docker架构详解
Docker Client
docker client是docker架构中用户用来和docker daemon建立通信的客户端;docker client发送容器管理请求后,由docker daemon接受并处理请求。
Docker Daemon
- 定义:docker daemon是docker架构中一个常驻在后台的系统进程。docker daemon启动所使用的可执行文件也为docker,与docker client启动时所使用的docker可执行文件相同。在docker命令执行时,通过传入的参数来辨别docker daemon与docker client
- 功能:接受并处理docker client发送的请求
- 架构及通信过程:
- 架构:docker server、engine和job
- 通信过程:该守护进程在后台启动一个server,server负责接受docker client发送的请求;接受请求后,server通过路由与分发调度,找到相应的handler(头部消息,含包的类型)来执行请求。
Docker Server
docker server在docker架构中专门服务于docker client的server。
- 功能:接受并调度分发docker client发送的请求。
- 注意:Docker Server的运行在Docker的启动过程中,是靠一个名为”serveapi”的job的运行来完成的。原则上,Docker Server的运行是众多job中的一个,但是为了强调Docker Server的重要性以及为后续job服务的重要特性,将该”serveapi”的job单独抽离出来分析,理解为Docker Server。
- docker server选项中,Runc是容器真正运行的地方,以12版本为分界线,12版本以前用lxc,12版本以后用runc(通过docker version命令查看)
- http/https:
- routs
Engine
Engine是docker架构中的运行引擎,同时是docker的核心模块,他扮演docker container存储仓库的角色。
- 功能:通过执行job的方式操控管理容器。
Job
一个job为docker架构中最基本的工作执行单元,docker可以做的每一项工作都可以抽象为一个job。
- job有名称、参数、环境变量、标准的输入和输出、错误处理和返回状态等。
Docker Registry
docker registry是存储容器镜像的仓库。容器镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录。
- 功能:docker的运行过程中,docker daemon会与docker registry通信,实现镜像的搜索(search)、下载(pull)、上传(push)功能
Graph
graph是docker架构中已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。
- 组成:
- repository:存储镜像的具体内容。
- graphDB:记录所有文件系统镜像彼此之间的关系。 - GraphDB是一个构建在SQLite之上的小型图数据库,实现节点之间关联关系的记录,只提供简单接口表示节点之间的关系。
- 目录位置:/var/lib/docker/images/overlay2
- 存储信息:存储容器镜像的元数据(Metadata)、容器镜像的大小信息(layerSize),层级关系数据(layerdb),具体镜像数据(imagedb) - 目录位置:/var/lib/docker/overlay2
- 存储信息:容器镜像中提取的rootfs
Driver
driver是docker架构中的驱动模块;通过driver驱动,docker可以实现对docker容器执行环境的定制。
- 目的:为了将docker容器中的管理从docker daemon内部业务逻辑中区分开。
- 类型:graphdriver、networkdriver、execdriver。
graphdriver
用于完成容器镜像的管理,包括存储与获取。当用户下载指定的容器镜像时,graphdriver将容器镜像存储在本地的指定目录中;同时当用户需要指定该镜像创建容器的rootfs时,graphdriver从本地镜像存储目录获取指定的容器镜像。
networkdriver
完成docker容器网络环境的配置,包括:docker启动时为docker环境创建网桥;创建容器的虚拟网卡;容器分配ip、端口;与虚拟机做端口映射;设置容器防火墙策略等。
execdriver
容器的执行驱动,负责创建容器运行命名空间、容器资源使用的统计和限制、容器内部进程的真正运行。execdriver默认使用native驱动,不依赖于LXC(1.2版本之后)
libcontainer
是docker架构中使用Go语言(跨平台语言)设计实现的库,docker可以直接调用libcontainer,最终操纵容器的namespace、cgroup、appmarmor、网络设备以及防火墙规则;不需要依赖LXC或者其他包。
libcontainer提供了一整套标准的接口来满足上层对容器管理的需求。或者说,libcontainer屏蔽了Docker上层对容器的直接管理。
docker container
是Docker架构中服务交付的最终体现形式
rootfs
- rootfs:根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
- Initramfs:是内存中的临时操作系统,虚拟的,最小的操作系统(fs:文件系统。)
bootfs
- 作用:引导内核(kernel-vmlinuxz),虚拟启动硬件,让虚拟系统读取扇区。