Docker工作原理

Docker架构的工作原理

对Docker不太熟悉的朋友可以参考博文:Docker简介及安装配置详解
首先Docker是基于Go语言进行开发的,而且是基于C/S结构进行工作的,如图:
Docker工作原理
从图中可以看出:
(1)用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者;
(2)Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;而后Engine(引擎)执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在;
(3)Job的运行过程中,当需要容器镜像时,则从Docker Registry(docker仓库)中下载镜像,并通过graphdriver(镜像管理驱动)将下载镜像以Graph(图像)的形式存储;当需要为Docker创建网络环境时,通过networkdriver(网络管理驱动)创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver(执行管理驱动)来完成。
(4)libcontainer(容器库)是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。

各个模块的功能

(1)docker client

docker client是docker架构中用户用来和docker daemon建立通信的客户端,用户可以通过dicker命令行工具发起众多管理docker container的请求。

docker client发送容器管理请求后,由docker daemon接受并处理请求,当docker client接收到返回的请求相应并简单处理后,docker client一次完整的生命周期就已经结束了。

(2)docker daemon

docker daemon 是docker架构中一个常驻在后台的系统进程,功能就是:接收处理docker client发送的请求。该守护进程在后台启动一个server,server负载接受docker client发送的请求;接受请求后,server通过路由与分发调度,找到相应的handler(处理器)来执行请求。

(3)docker server

 docker server在docker架构中是专门服务于docker client的server,该server的功能就是:接受并调度分发docker client发送的请求。

(4)engine

Engine是Docker架构中的运行引擎,同时也Docker运行的核心模块。它扮演Docker container存储仓库的角色,并且通过执行job的方式来操纵管理这些容器。

(5)job

一个Job可以认为是Docker架构中Engine内部最基本的工作执行单元,Docker可以做的每一项工作,都可以抽象为一个job。

(6)docker registry

Docker Registry是一个存储容器镜像的仓库。而容器镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录。

(7)Graph

Graph在Docker架构中扮演已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。一方面,Graph存储着本地具有版本信息的文件系统镜像,另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系。

(8)driver

Driver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现对Docker容器执行环境的定制。由于Docker运行的生命周期中,并非用户所有的操作都是针对Docker容器的管理,另外还有关于Docker运行信息的获取,Graph的存储与记录等。因此,为了将Docker容器的管理从Docker Daemon内部业务逻辑中区分开来,设计了Driver层驱动来接管所有这部分请求。

在Docker Driver的实现中,可以分为以下三类驱动:

  • graphdriver主要用于完成容器镜像的管理,包括存储与获取。即当用户需要下载指定的容器镜像时,graphdriver将容器镜像存储在本地的指定目录;同时当用户需要使用指定的容器镜像来创建容器的rootfs时,graphdriver从本地镜像存储目录中获取指定的容器镜像;
  • networkdriver的用途是完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境创建网桥;Docker容器创建时为其创建专属虚拟网卡设备;以及为Docker容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等;
  • execdriver作为Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。在execdriver的实现过程中,原先可以使用LXC驱动调用LXC的接口,来操纵容器的配置以及生命周期,而现在execdriver默认使用native驱动,不依赖于LXC。具体体现在Daemon启动过程中加载的ExecDriverflag参数,该参数在配置文件已经被设为”native”;
(9)libcontainer

libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的API。正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等。

(10)docker container

Docker container(Docker容器)是Docker架构中服务交付的最终体现形式。Docker按照用户的需求与指令,订制相应的Docker容器。用户通过指定容器镜像,使得Docker容器可以自定义rootfs等文件系统; 用户通过指定计算资源的配额,使得Docker容器使用指定的计算资源; 用户通过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境; 用户通过指定运行的命令,使得Docker容器执行指定的工作。

如果想对Docker有更加深入的研究可以参考博文:Docker架构原理及简单使用

————————————本文到此结束,感谢观看——————————————

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一个开源的容器化平台,它可以帮助开发者将应用程序及其所有依赖项打包到一个独立的、可移植的容器中。Docker工作原理可以简单概括为以下几个步骤: 1. 创建镜像:使用Dockerfile定义一个应用程序的环境配置和依赖项,然后使用Docker命令构建镜像。镜像是一个只读的模板,包含了运行应用程序所需的一切。 2. 运行容器:使用Docker命令基于镜像创建一个容器实例。容器是镜像的运行时实例,它包含了应用程序及其依赖项,并在隔离的环境中运行。 3. 文件系统隔离:每个容器都有自己的文件系统,它与宿主机的文件系统隔离开来。容器中的文件系统基于镜像,可以读写,但对于容器外部来说是只读的。 4. 资源隔离:Docker使用Linux内核的特性,如命名空间和控制组(cgroup),实现对容器中进程的资源隔离。这样每个容器都拥有自己独立的CPU、内存等资源。 5. 网络隔离:每个容器都有自己独立的网络命名空间,可以拥有自己的IP地址和端口。Docker提供网络驱动程序,使容器可以与其他容器或宿主机进行通信。 6. 生命周期管理:Docker提供了一系列命令和API,用于管理容器的生命周期,如启动、停止、重启、删除等操作。这样可以方便地管理和维护容器。 总之,Docker利用容器化技术实现了应用程序的隔离和环境一致性,提供了更高效、可移植和可扩展的应用部署方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值