docker底层的内核

[toc]

底层结构

docker底层

docker底层的内核:(rootfs / linux namespace / control groups)

经典云计算架构

基础云计算架构包括 IaaS (基础即服务), SaaS(软件即服务), PaaS(平台即服务)三层服务。

img

介绍

  1. IaaS 基础架构即服务

    云基础架构服务称为基础架构即服务(IaaS),由高度可扩展和自动化的计算资源组成。 IaaS是完全自助服务,用于访问和监控计算、网络,存储和其他服务等内容,它允许企业按需求和需要购买资源,而不必购买全部硬件。

  2. SaaS 软件即服务(也称为云应用程序服务)

    代表了云市场中企业最常用的选项。 SaaS利用互联网向其用户提供应用程序,这些应用程序由第三方供应商管理。 大多数SaaS应用程序直接通过Web浏览器运行,不需要在客户端进行任何下载或安装。

  3. PaaS 平台即服务

    云平台服务或平台即服务(PaaS)为某些软件提供云组件,这些组件主要用于应用程序。 PaaS为开发人员提供了一个框架,使他们可以基于它创建自定义应用程序。所有服务器,存储和网络都可以由企业或第三方提供商进行管理,而开发人员可以负责应用程序的管理。

查看源图像

SaaS vs PaaS vs IaaS

总体而言,每种云模型都提供了自己的特定功能和特性,因此您的解组织了解这些差异至关重要。 无论您是在寻找云存储软件,还是一个能创建定自定义应用程序的平滑平台,,或者希望完全控制整个基础架构而无需对其进行物理维护,您可以使用云服务。 无论您选择哪个选项,迁移到云都是业务和技术的未来,并且很必要让大家正确的了解这一点。

BaaS:区块链即服务

Baas 区块链即服务什么是区块链即服务(BaaS)?

区块链即服务(BaaS)是为从事构建区块链应用程序业务的公司创建和管理的基于云的网络的第三方创建和管理。这些第三方服务是不断发展的区块链技术领域中相对较新的发展。区块链技术的应用已经远远超出了其在加密货币交易中最广为人知的用途,并已扩展到解决各种安全交易。因此,对托管服务有需求。

image-20221031173356050

现在区块链不光是各个IT巨头,金融机构,咨询公司等也都参与其中,创业型区块链公司也存在不少,随着技术的不断发展,竞争也相当激烈。Hyperledger之前也发布了fabric1.0正式版,改进了架构更适合应用落地。区块链是一个分布式的应用,去中心化多节点,即使有spv认证模式,还是要求有一部分节点下载完整的数据记录,以比特币为例,目前几百G的数据,随着数据量的不断增长,对本地计算资源和存储资源都是一种挑战,之前有人这样说过:本地资源永远是有限的,只有云资源可以不断扩展,理解云资源可以不断扩展。先不论这种说法的正确性,区块链结合云计算存储平台必然是一种发展趋势。云平台目前最为广泛的就是iaas、paas、saas,那么区块链结合云平台我们称为BaaS,理解区块链即服务。

那么区块链切入云平台,根据这个BaaS中的“B”,blockchain,应该怎么理解。或者应该区分BaaS和btaas,BaaS和btaas根据网络上一些说法baas是指区块链即服务btaas是指区块链技术即服务。各种观念的提出都有自己的理论基础,这里不做定义,只是对两个理解做一个笔者自己的简单理解,如有不对希望及时指正。

上图很好的说明的这两种概念定义。

区块链服务:广义理解,把区块链的应用,比如比特币、以太坊等这类型公链,节点直接部署在云平台,节点提供查询,交易、区块生成等操作,底层使用云计算资源和云存储空间,这种简单理解为区块链服务,当然上图也说到了公链的延伸应用-存证型-Factom,数字身份型-uPort等,云平台的容错、网络的多链路负载、计算资源的动态调整,其实针对区块链中的节点能够更好的实现他的服务,从一定角度来讲也节省了节点的运行成本,提高了整个系统之间交互的效率。当然从区块链服务这个词汇来理解就是云平台上搭建区块应用,业务直接访问在云平台之上的区块链应用平台,结合图上,区块链浏览器、数字货币交易平台以及一些现有的区块链系统提供开放的服务。

区块链技术服务:区块链技术,这个词汇包含的东西比较多,通俗来说区块链技术就是:加密技术、共识机制、P2P的网络、分布式系统等一些技术的结合,那么在云平台的区块链技术多指这些技术的结合后区块链架构框架或者区块链操作系统,主要是HyperLedger,multichain,以太坊私有链等多个框架,使用这些框架去结合应用业务需求,开发出适合业务的应用,甚至这些应用要求优于现有的互联网技术,这种方式称为区块链技术服务。

在网上查资料的时候看到有位大神对这两个区块链服务/技术服务概念提出了一个很好的比喻:www. 8btc.com/talk-about-baas(有兴趣看看,笔者也是看了这个想到这概念的)。阿里云提供云服务,他提供的是云资源的实例,阿里不会告诉你如何去搭建云,他提供是云的服务,付费即可享受服务。上面讨论的BaaS可以认为是提供公链的实例服务,btaas提供的是区块链架构框架,你需要开发部署你的区块链应用服务。

BaaS 基于软件即服务 (SaaS) 模型,并以类似的方式工作。它允许客户利用基于云的解决方案在区块链上构建、托管和操作自己的区块链应用程序和相关功能。同时,基于云的服务提供商保持基础架构的敏捷性和可操作性。

作为更大的区块链生态系统的发展,BaaS被视为促进区块链在企业中的采用。

BaaS领域的主要参与者包括:

  • 微软,与ConsenSys合作,于2015年在Microsoft Azure上推出以太坊区块链即服务。
  • 亚马逊推出了Amazon Managed Blockchain,该服务使用包括Ethereum和Hyperledger Fabric在内的开源框架“可以轻松创建和管理可扩展的区块链网络”。
  • R3,一个由全球金融机构组成的联盟,制作了一个名为Corda的分布式金融账本。
  • PayStand,专门从事公司之间的付款和收款。

消费者和企业越来越愿意适应区块链技术。然而,创建、配置和运营区块链以及维护其基础设施所涉及的技术复杂性和运营开销通常会成为障碍。

BaaS提供了一个外部服务提供商来设置所有必要的区块链技术和基础设施,但需要付费。创建后,提供程序将继续处理客户端的复杂后端操作。

BaaS 运营商通常提供支持活动,例如带宽管理、适当的资源分配、托管要求和数据安全功能。BaaS运营商使客户能够专注于核心工作:区块链的功能。

区块链即服务(BaaS)示例:

下图展示了区块链即服务Hyperledger Cello的工作模型,这是一个类似BaaS的区块链模块工具包和Hyperledgeropen in new window项目下的实用程序系统。

Cello

实际上,BaaS提供商的角色类似于网络托管提供商的角色。网站创建者在自己的个人计算机上创建和运行所有网站内容。他们可能会雇用支持人员或与亚马逊网络服务或 HostGator 等外部托管服务提供商签约。这些第三方公司负责基础设施和维护问题。

BaaS可能是导致区块链技术在各个行业部门和业务中更广泛和更深入渗透的催化剂。无论大小,企业现在都可以简单地外包技术复杂的工作并专注于其核心活动,而不是创建和运行自己的区块链。

docker

docker将每个应用做成一个沙盒,各个应用都运行在容器中(namespace)

  1. docker是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖到一个容器中,发布到流行的liunx系统上,或者实现虚拟化。
  2. k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等。

docker 如今是容器的代名词,我们知道 docker 中最小的单位是容器,但是在 k8s 中最小的单位是 pod

打包方式的区别:

  • docker 通过镜像分发
  • k8s – helm
虚拟化角度:

传统的虚拟技术,在将物理硬件虚拟成多套硬件后,需要再每套硬件上都部署一个操作系统,接着在这些操作系统上运行相应的应用程序。

Docker容器内的应用程序进程直接运行在宿主机(真实物理机)的内核上,Docker引擎将一些各自独立的应用程序和它们各自的依赖打包,相互独立直接运行于未经虚拟化的宿主机硬件上,同时各个容器也没有自己的内核,显然比传统虚拟机更轻便。每个集群有多个节点,每个节点可,我们的kuberbete就是管理这些应用程序所在的小运行环境(container)而生。

部署角度:

传统方式是将所有应用直接部署在同一个物理机器节点上,这样每个App的依赖都是完全相同的,无法做到App之间隔离,当然,为了隔离,我们也可以通过创建虚拟机的方式来将App部署到其中,但这样太过繁重,故比虚拟机更轻便的Docker技术出现,现在我们通过部署Container容器的技术来部署应用,全部Container运行在容器引擎上即可。以kubernetes为代表的容器集群管理系统,我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

我们在之前知道了虚拟机和容器的区别

虚拟机的内核和文件系统存在不同的位置,系统加载的时候去启动内核,没有加载就是文件

容器就是把文件系统打包出去,应用所在的依赖全部保存起来。

ab
  • 虚拟机通过 Hypervisor 仅进行虚拟化,在这上面去运行操作系统 Centos
  • 容器通过 Docker Engine ,基于此实现的容器并不是虚拟化,没有客户机的操作系统,是共享内核的。

rootfs

什么是 rootfs ?

我们在每个 Linux 系统一定有一个根目录,这个根目录就是 rootfs

docker 也依旧是这样,我们进去容器的内部根文件系统。

image-20221031192452458

rootfsdocker 容器在启动时内部进程可见的文件系统,即 docker 容器根目录, rootfs 通常包含一个操作系统运行所需的文件系统。

在传统的 linux 启动的时候,首先挂载一个只读的 rootfs ,当系统检测器完整性后,再切换为读写模式; 而在 docker 架构中,当 docekr daemondocker 容器挂载 rootfs 时,沿用的 linux 内核启动时的方法,即将 rootfs 设置为只读模式, 挂载完毕后,利用联合文件系统技术 在已有的只读 rootfs 上再挂载一个读写层,这样,读写层位于 docker 容器文件系统的最顶层,其下可能联合挂载了多个只读层。

rootfs 只是一个操作系统包含的文件、配置、目录,并不包括操作系统,在Linux中,这两个部分是分开存放的。

linux 内核默认存放到 /boot 下,而 /usr/src 中可查看内核的信息。有个 .img 的文件,这就是系统内核映像文件。

image-20221031195613278

Namespace

什么是 Namespace ?

我们的docker是共享同一个内核的,使用 Namespace 可以创建隔离,决定进程可以看到或者使用哪些资源。

namespace 是 Linux 内核用来隔离内核资源的方式,通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源。

img

进程命名空间查看

进程命名空间查看:

ls /proc/{PD}/ns

image-20221031201635589

control groups

2.6.24 版本开始,linux 内核提供了一个叫做 cgroups(控制组)的特性。cgroups 就是 control groups 的缩写,用来对一组进程所占用的资源做限制、统计、隔离。也是目前轻量级虚拟化技术 lxc (linux container)的基础之一。每一组进程就是一个控制组,也就是一个 cgroupcgroups 分为几个子系统,每个子系统代表一种设施或者说是资源控制器,用来调度某一类资源的使用,如 cpu 时钟、内存、块设备 等。

什么是 control groups ?

我们通过 control groups 技术来约束进程对资源的使用。

rootfs 就像是房间的地板,Namespace 就像是一个墙,隔离每个房间,control groups 更像一个房顶,防止你跑出去了。

什么是特定:

cgroups 适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化(OS Level Virtualization)。

  1. 限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。

  2. 进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。

  3. 记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间

  4. 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

Cgroups子系统介绍:

  • blkio — 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
  • cpu — 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
  • cpuacct — 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
  • cpuset — 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
  • devices — 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
  • freezer — 这个子系统挂起或者恢复 cgroup 中的任务。
  • memory — 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
  • net_cls — 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
  • ns — 名称空间子系统。