当前位置: 首页 > Linux

图解Docker架构

时间:2023-04-07 01:48:56 Linux

Docker的总体架构图docker是C/S模式架构,后端是松耦合架构,各模块各司其职。用户使用DockerClient与DockerDaemon建立通信,并向后者发送请求。DockerDaemon作为Docker架构的主体部分,首先提供了Server的功能,使其能够接受来自DockerClient的请求;Engine在Docker内部执行一系列作业,每个作业以Job的形式存在。作业运行过程中,当需要容器镜像时,从DockerRegistry下载镜像,通过镜像管理驱动graphdriver将下载的镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器的运行资源或者执行用户指令等操作时,都是通过execdriver来完成的。libcontainer是一个独立的容器管理包,networkdriver和execdriver都使用libcontainer来实现对容器的具体操作。Docker各模块组件解析DockerClient[发起请求]DockerClient是与DockerDaemon建立通信的客户端。用户使用的可执行文件是docker(类似可执行脚本的命令),docker命令后面跟着参数,实现一个完整的请求命令(比如dockerimages,docker是不可变命令,images是一个可变参数)。DockerClient可以通过以下三种方式与DockerDaemon建立通信:tcp://host:port、unix://path_to_socket和fd://socketfd。DockerClient发送容器管理请求后,DockerDaemon接受并处理该请求。当DockerClient收到并响应返回的请求并简单处理后,一个完整的DockerClient生命周期就结束了。(一个完整的请求:发送请求→处理请求→返回结果),与传统的C/S架构请求流程没有区别。DockerDaemon【后台守护进程】DockerDaemonDockerServer架构图【调度分发请求】DockerServer架构图DockerServer相当于C/S架构的服务器。功能是接受和调度DockerClient发送的请求。Server接受请求后,通过路由和分发调度找到对应的Handler执行请求。Docker在启动过程中,通过包gorilla/mux创建了一个mux.Router,提供请求的路由功能。在Golang中,gorilla/mux是一个强大的URL路由器和调度器。mux.Router中添加了很多路由项,每个路由项由三部分组成:HTTP请求方法(PUT、POST、GET或DELETE)、URL、Handler。创建mux.Router后,Docker以服务器的监听地址和mux.Router为参数,创建一个httpSrv=http.Server{},最后执行httpSrv.Serve()为请求服务。在Server的服务过程中,Server接受DockerClient对listener的访问请求,并创建一个全新的goroutine来为请求服务。在goroutine中,首先读取请求内容,然后做解析工作,然后找到对应的路由项,然后调用对应的Handler处理请求,最后Handler处理完请求后回复请求。EngineEngine是Docker架构中的运行引擎,也是Docker运行的核心模块。它扮演着Docker容器存储仓库的角色,通过执行作业来操作和管理这些容器。在引擎数据结构的设计和实现过程中,有一个处理程序对象。处理程序对象存储所有处理程序处理许多特定作业的访问权限。例如Engine的handler对象中有一项:{"create":daemon.ContainerCreate,},意思是当名为"create"的作业运行时,会执行daemon.ContainerCreate的handler。Job作业可以认为是Docker架构中Engine内部最基本的工作执行单元。Docker可以做的每一个工作都可以抽象成一个作业。例如:在容器内运行进程是一项工作;创建一个新容器是一项工作。DockerServer的运行进程也是一个名为serveapi的job。Job的设计者将Job设计成类似于Unix进程。例如:Job有名称、参数、环境变量、标准输入输出、错误处理、返回状态。DockerRegistry【镜像注册中心】DockerRegistry是一个存放容器镜像的仓库(注册中心)。可以理解为一个云镜像仓库,按repository分类,dockerpull根据[repository]:[tag]精确定义一个镜像。在Docker运行过程中,DockerDaemon会与DockerRegistry通信,实现搜索镜像、下载镜像、上传镜像三个功能。这三个功能对应的作业名称分别是“search”、“pull”和“push”。可以分为公共仓库(dockerhub)和私有仓库。Graph[docker内部数据库]Graph架构图Repository下载镜像(包括下载镜像和dockerfile构建的镜像)的保管者。一个repository代表某种类型的镜像仓库(如Ubuntu),同一个repository中的镜像通过tags来区分(代表不同的tags或者同一类镜像的版本)。一个注册中心包含多个存储库,一个存储库包含多个相同类型的镜像。镜像存储类型有aufs、devicemapper、Btrfs、vfs等,其中centos系统使用的是devicemapper存储类型。同时,在Graph的本地目录中,存储了每个容器镜像的具体信息包括:容器镜像的元数据、容器镜像的大小信息、容器镜像所代表的具体rootfs。GraphDB的下载容器镜像之间关系的记录器。GraphDB是建立在SQLite之上的小型图数据库,实现了节点的命名和节点间关系的记录。Driver【执行部分】Driver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现Docker容器执行环境的定制化。即Graph负责图片存储,Driver负责容器执行。graphdrivergraphdriver架构图graphdriver主要用于完成容器镜像的管理,包括存储和获取。存储:通过dockerpull下载的镜像,由graphdriver存储在指定的本地目录(Graph中)。获取:dockerrun(create)使用镜像创建容器时,graphdriver从本地Graph获取镜像。networkdriver架构图networkdrivernetworkdriver的目的是完成Docker容器网络环境的配置,包括Docker启动时为Docker环境创建网桥;在创建Docker容器时为其创建专用的虚拟网卡设备;做端口映射,设置容器防火墙策略等execdriver架构图Execdriver作为Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计和限制,负责容器内部流程的实际运行。现在execdriver默认使用nativedriver,不依赖LXC。libcontainer[函数库]libcontainer的架构图libcontainer是Docker架构下用Go语言设计实现的库。设计的初衷是希望库可以直接访问内核中容器相关的API,而不需要依赖任何依赖。Docker可以直接调用libcontainer,最终操作容器的命名空间、cgroups、apparmor、网络设备、防火墙规则。libcontainer提供了一套标准的接口来满足上层对容器管理的需求。也就是说,libcontainer阻断了Docker上层对容器的直接管理。docker容器【服务交付的最终形式】容器架构Docker容器(Dockercontainer)是Docker架构中服务交付的最终形式。Docker根据用户的需求和指令定制相应的Docker容器:用户指定容器镜像,使Docker容器可以定制rootfs等文件系统;用户指定计算资源配额,让Docker容器使用指定的计算资源;用户通过配置网络及其安全策略,使Docker容器拥有独立、安全的网络环境;用户通过指定要运行的命令使Docker容器执行指定的工作。Author:HuWeihuanghttps://blog.csdn.net/huwh\_/article/details/71308236