当前位置: 首页 > 科技观察

一篇了解docker容器技术架构及其各个模块的文章

时间:2023-03-20 15:28:15 科技观察

概述今天主要简单介绍一下docker技术架构及其各个模块。技术架构分发负责与dockerregistry交互,上传bath镜像和v2registry相关的源数据。registry负责dockerregistry相关的身份认证、镜像搜索、镜像验证、registry镜像管理。交互操作等。image负责图像源数据相关的存储和查找,图像层的索引和查找,以及图像tar包相关的导入导出操作。reference负责存储本地所有镜像的repository和tag名称,并维护与镜像id的映射关系。layer模块负责image层和container层源数据相关的增删改查,负责将image层的增删改查映射到graphdriver模块实际上存储图像层文件。graghdriver是容器镜像相关所有操作的执行者。1.dockerclientdockerclient是docker架构中用户用来与dockerdaemon建立通信的客户端。用户使用的可执行文件是docker。通过docker命令行工具,可以发起很多容器管理的请求。docker客户端发送容器管理请求后,docker守护进程接受并处理该请求。当dockerclient收到并响应返回的请求并简单处理后,dockerclient一个完整的生命周期就结束了。当需要继续发送容器管理请求时,用户必须通过docker可执行文件重新创建一个docker客户端。2.dockerdaemondockerdaemon是docker架构中驻留在后台的系统进程。它的作用是接收和处理docker客户端发送的请求。守护进程在后台启动一个服务器,服务器负载接受docker客户端发送的请求;服务端接受请求后,通过路由和分发调度找到对应的handler执行请求。用于启动dockerdaemon的可执行文件也是docker,与用于启动dockerclient的可执行文件docker相同。执行docker命令时,通过传入的参数来区分dockerdaemon和dockerclient。3.dockerserverdockerserver是docker架构中专门为dockerclient服务的服务器。服务端的作用是接受和分发docker客户端发送过来的请求。架构图如下:Docker在启动过程中,通过包gorilla/mux(分析golang的类库),创建了一个mux.Router,提供请求的路由功能。在Golang中,gorilla/mux是一个强大的URL路由器和调度器。mux.Router中添加了很多路由项,每个路由项由三部分组成:HTTP请求方法(PUT、POST、GET或DELETE)、URL、Handler。4.engineEngine是Docker架构中的运行引擎,也是Docker运行的核心模块。它扮演着Docker容器存储仓库的角色,通过执行作业来操作和管理这些容器。在引擎数据结构的设计和实现过程中,有一个处理程序对象。处理程序对象存储所有处理程序处理许多特定作业的访问权限。例如Engine的handler对象中有一项:{"create":daemon.ContainerCreate,},意思是当名为"create"的作业运行时,会执行daemon.ContainerCreate的handler。5.Job作业可以认为是Docker架构中Engine内部最基本的工作执行单元。Docker可以做的每一个工作都可以抽象成一个作业。例如:在容器内部运行一个进程,这是一个作业;创建一个新的容器,这是一个工作,从网上下载一个文件,这是一个工作;包括之前在DockerServer部分提到的,为HTTPAPI创建一个Server服务,这也是一个工作等等。Job的设计者将Job设计成类似于Unix进程。例如:Job有名称、参数、环境变量、标准输入输出、错误处理、返回状态。6、dockerregistryDockerRegistry是一个存放容器镜像的仓库。容器镜像是容器创建时加载的用来初始化容器的文件结构和目录。在Docker运行过程中,DockerDaemon会与DockerRegistry通信,实现搜索镜像、下载镜像、上传镜像三个功能。这三个功能对应的作业名称分别是“search”、“pull”和“push”。其中,在Docker架构中,Docker可以使用公共的DockerRegistry,也就是大家熟知的DockerHub。这样,Docker在获取容器镜像文件时,必须通过Internet访问DockerHub;同时,Docker还允许用户构建本地私有Docker。Registry,可以保证在内网完成容器镜像的获取。7.GraphGraph在Docker架构中充当下载容器镜像的保管者,以及下载容器镜像之间关系的记录器。Graph一方面存储本地文件系统镜像和版本信息,另一方面也通过GraphDB记录所有文件系统镜像之间的关系。Graph的架构如下:其中,GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名和节点间关系的记录。它只实现了大多数图形数据库的一小部分,但提供了一个简单的接口来表示节点之间的关系。同时,在Graph的本地目录中,存储了每个容器镜像的具体信息包括:容器镜像的元数据、容器镜像的大小信息、容器镜像所代表的具体rootfs。8.driverDriver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现Docker容器执行环境的定制化。因为在Docker运行的生命周期中,并不是所有的用户操作都是针对Docker容器的管理。此外,还有Docker运行信息的获取,Graph的存储和记录等。因此,为了将Docker容器的管理与DockerDaemon的内部业务逻辑分开,设计了一个Driver层驱动来接管所有这些要求。9.libcontainerlibcontainer是Docker架构下用Go语言设计实现的库。设计的初衷是希望库可以直接访问内核中容器相关的API,而不需要依赖任何依赖。正是因为libcontainer的存在,Docker才能直接调用libcontainer,最终操作容器的namespace、cgroups、apparmor、网络设备、防火墙规则。这一系列操作的完成不需要依赖LXC或者其他包。libcontainer的架构如下:另外,libcontainer提供了一套标准的接口来满足上层对容器管理的需求。也就是说,libcontainer阻断了Docker上层对容器的直接管理。并且由于libcontainer是使用Go这种跨平台语言开发实现的,可以被多种上层编程语言访问,所以很难说未来的Docker会和Linux紧紧捆绑在一起。同时,微软还在其著名的云计算平台Azure中加入了对Docker的支持,可见Docker的开放性和业界的流行度。10、docker容器Docker容器(Dockercontainer)是Docker架构中服务交付的最终形式。Docker根据用户的需求和指令定制对应的Docker容器:用户指定容器镜像,这样Docker容器就可以定制rootfs等文件系统;用户指定计算资源配额,让Docker容器使用指定的计算资源;用户通过配置网络及其安全策略,使Docker容器拥有独立、安全的网络环境;用户通过指定要运行的命令使Docker容器执行指定的工作。