yujin2010good
作者yujin2010good2018-11-22 09:29
系统工程师, 大型零售巨头

docker学习一--基本概念

字数 2870阅读 1146评论 0赞 4

docker---第三代paas平台

集装箱
彻底开源
核心技术:LXC、cgroup、aufs、jails、selinux、btrfs等


cgroups:就是controller group,在这个group中,有分配好的特定比例的cpu时间,io时间,可用内存大小等。

cgroup是将任意进程进行分组化管理的linux内核功能。最初有google的攻城狮提出,后来被整合进linux内核中。

cgroups中的重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配的,然后才control group的。

比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。

cgroup被linux内核支持,有得天独厚性能优势,发展势头迅猛,在很多领域可以取代虚拟化技术分割资源。

cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源:cpu、mem、iops、iobandwide、device、acess等


LXC

LXC是linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。借助namespace的隔离机制和cgroup限额功能,LXC提供了一套统一的API和工具来建立和管理containers。LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在与LXC被整合进内核,不用单独为内核打补丁。

LXC旨在提供一个共享kernel的os级虚拟化方法,在执行时不用重复加载kernel,且containers的kernel与host共享,因此可以大大加快container的启动过程,并显著减少内存消耗,容器在提供隔离的同时还通过共享这些资源节省开销,这意味着容器比真正的虚拟化开销要小得多,在实际测试中,基于LXC的虚拟化方法的IO和cpu性能几乎接近baremetal的性能。

虽然容器所使用的这种类型隔离总的来说非常强大,然而是不是像运行在hypervisor的虚拟机那么强壮还是具有争议性的,如果内核停止,那么所有的容器就会停止运行。

性能方面:LXC>KVM>XEN
内存利用率:LXC>KVM>XEN
隔离程度:XEN>KVM>LVM


AUFS

什么是AUFS?它是一个能透明覆盖一或者多个现有文件系统的层状文件系统。支持将不同的目录挂载到同一个虚拟文件系统下,可以把不通目录联合在一起,组成一个单一的目录,这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可。

docker一直使用AUFS作为容器的文件系统,当一个进程需要修改一个文件时,AUFS创建该文件的一个副本。Aufs可以把多层合并成文件系统的单层表示,这个过程成为
写入复制(copy on write)


App打包

LXC的基础上,docker提供额外的Feature包括:标准统一的打包部署运行方案。

======================================
下面是我总结的一些Docker的使用场景,它为你展示了如何借助Docker的优势,在低开销的情况下,打造一个一致性的环境。内容来自:八个Docker的真实应用场景

1. 简化配置

这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

2. 代码流水线(Code Pipeline)管理

前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

3. 提高开发效率

这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。

不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。

理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。

4. 隔离应用

有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。

我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。

5. 整合服务器

正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。

6. 调试能力Docker

提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。

7. 多租户环境

另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。你可以在这里了解关于此场景的更多信息。

8. 快速部署

在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。

你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

4

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广