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 架构的变化之路 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架构中已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。

docker 架构的变化之路 docker 架构图_Docker_02

  • 组成:
    - 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 架构的变化之路 docker 架构图_Docker_03

docker container

是Docker架构中服务交付的最终体现形式

rootfs

  • rootfs:根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
  • Initramfs:是内存中的临时操作系统,虚拟的,最小的操作系统(fs:文件系统。)

bootfs

  • 作用:引导内核(kernel-vmlinuxz),虚拟启动硬件,让虚拟系统读取扇区。