天天看点

云原生必备知识: Linux 容器-隔离

所属技术领域:

云原生

| 名词定义 |

Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例(The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. )。Linux 内核中实现了六种 namespace,按照引入的先后顺序,列表如下:

namespace 引入的相关内核版本 被隔离的全局系统资源 在容器语境下的隔离效果

Mount namespaces Linux 2.4.19

文件系统挂接点 每个容器能看到不同的文件系统层次结构

UTS namespaces Linux 2.6.19

nodename 和 domainname 每个容器可以有自己的 hostname 和 domainame

IPC namespaces Linux 2.6.19

特定的进程间通信资源,包括System V IPC 和 POSIX message queues

每个容器有其自己的 System V IPC 和 POSIX 消息队列文件系统,因此,只有在同一个 IPC namespace 的进程之间才能互相通信

PID namespaces Linux 2.6.24

进程 ID 数字空间 (process ID number space) 每个 PID namespace 中的进程可以有其独立的 PID; 每个容器可以有其 PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID。

Network namespaces 始于Linux 2.6.24 完成于 Linux 2.6.29

网络相关的系统资源 每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。

User namespaces 始于 Linux 2.6.23 完成于 Linux 3.8)

用户和组 ID 空间 在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同; 每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为 user namespace 中的特权用户;

Linux namespace 的概念说简单也简单说复杂也复杂。简单来说,我们只要知道,处于某个 namespace 中的进程,能看到独立的它自己的隔离的某些特定系统资源;复杂来说,可以去看看 Linux 内核中实现 namespace 的原理,网络上也有大量的文档供参考,这里不再赘述。

| 发展历程 |

以下是从维基百科和其他来源提取的容器历史的简短摘要:

1979年-chroot

容器的概念早在1979年就开始使用UNIX chroot。这是一个UNIX操作系统系统调用,用于更改进程的根目录,并将其作为子文件到文件系统中的新位置,该位置仅对给定进程可见。此功能的想法是为每个进程提供隔离的磁盘空间。 1982年晚些时候,这被添加到BSD。

2000年-FreeBSD Jails

FreeBSD Jails是由Derrick T. Woolworth在2000年为R&D Associates for FreeBSD推出的早期容器技术之一。它是一个类似于chroot操作系统的系统调用,包括用于隔离文件系统、用户、网络的其他进程沙盒功能。因此,它可以为每个Jails、自定义软件安装和配置等提供分配IP地址的方法。

2001年-Linux VServer

Linux VServer是另一种jail机制,可用于安全地分区计算机系统上的资源(文件系统,CPU时间,网络地址和内存)。每个分区称为安全上下文,其中的虚拟化系统称为虚拟专用服务器。

2004年-Solaris容器

Solaris Containers是针对x86和SPARC系统推出的,首次于2004年2月在Solaris 10的build 51 beta版中公开发布,随后在Solaris 10,2005的第一个完整版本中发布。Solaris Container是系统资源控制和边界的组合区域提供的分离。在单个操作系统实例中充当完全隔离的虚拟服务器。

2005年-OpenVZ

OpenVZ与Solaris Containers类似,并使用修补的Linux内核来提供虚拟化,隔离,资源管理和检查点。每个OpenVZ容器都有一个独立的文件系统,用户和用户组,进程树,网络,设备和IPC对象。

2006年-流程容器

Process Containers于2006年在Google实施,用于限制、统计和隔离进程集合的资源使用(CPU、内存、磁盘I/O、网络等)。后来,它被重命名为控制组,以避免Linux内核上下文中“容器”一词的多重含义混淆,并合并到Linux内核2.6.24中。这显示了谷歌在集装箱技术上的早期参与,以及他们是如何做出贡献的。

2007年-控制组

如前所述,控制组AKA cgroup是由Google实现的,并于2007年添加到Linux内核中。

2008年-LXC

LXC代表Linux容器,它是Linux容器管理器的第一个、最完整的实现。它是使用cgroup和Linux名称空间实现的。LXC是在liblxc库中交付的,并为Python 3、Python 2、Lua、Go、Ruby和Haskell中的API提供了语言绑定。与其他容器技术不同,LXC在Vanila Linux内核上工作,不需要任何补丁。今天LXC项目由佳能有限公司赞助。

2011年-守望者

Warden在2011年由CloudFoundry实施,在初始阶段使用LXC,后来又用自己的实现取而代之。与LXC不同,Warden并没有与Linux紧密结合。相反,它可以在任何可以提供隔离环境的操作系统上工作。它作为守护程序运行,并提供用于管理容器的API。

2013-lmctfy

lmctfy是Google容器堆栈的开源版本,提供Linux应用程序容器。谷歌启动了这个项目的目的是提供有保证的性能,高资源利用率,共享资源,容器的近零开销。今天Kubernetes使用的cAdvisor工具是由lmctfy项目启动的。 lmctfy的最初版本于2013年10月发布,2015年,Google决定向libcontainer提供核心lmctfy概念和抽象。结果现在LMCTFY没有进行积极的开发。

libcontainer项目最初由Docker启动,现在已经转移到Open Container Foundation。

2013年-Docker

截至2016年1月,Docker是最受欢迎和最广泛使用的容器管理系统。它是作为一个名为dotCloud的平台即服务公司的内部项目开发的,后来改名为Docker。与Warden类似,Docker在初始阶段也使用了LXC,后来用它自己的libcontainer库替换了LXC。与任何其他容器平台不同,Docker引入了用于管理容器的整个生态系统。这包括一个高效的分层容器映像模型,一个全局和本地容器注册表,一个干净的REST API,一个CLI等。在稍后阶段,Docker还主动实现了一个名为Docker Swarm的容器集群管理解决方案。

2014-Rocket

Rocket是一个与Docker非常相似的项目,用于修复他们在Docker中发现的一些缺陷。CoreOS提到,他们的目标是提供比Docker更严格的安全和生产要求。更重要的是,它是在AppContainer规范上实现的,是一个更加开放的标准。除了Rocket,CoreOS还开发了Docker和Kubernetes使用的其他几种与集装箱有关的产品。

2016-Windows容器

微软还主动在2015年为基于Windows的应用程序(称为Windows容器)向Microsoft Windows Server操作系统添加容器支持。这将与Microsoft Windows Server 2016一起发布。通过这种实现,Docker可以在Windows上本地运行Docker容器,而无需运行虚拟机来运行Docker(早期的Docker使用Linux VM在Windows上运行)。

| 技术特点 |

文件系统隔离:每个容器都有自己的root文件系统

进程隔离:每个容器都运行在自己的进程环境中

网络隔离:容器件的虚拟网络接口和IP地址都是分开的

资源隔离和分组:使用cgroup将CPU和内存之类的资源独立分配给每个容器

适用场景:

容器的优点在于以接近物理机的运行效率提供了虚拟化功能、能比虚拟机达到更高的实例密度、达到秒级的启动速度。Docker又加上了层级镜像的创新,使得软件的发布和部署非常便捷。能用上这些优点的地方,自然就是Docker的使用场景了。

实际上这样的场景是非常多的,这也是Docker的生态发展的如此快速和繁荣的原因之一。我们看到有无数基于Docker的开源项目产生,包括CoreOS、Kubernetes、Deis等等,而现有的开源项目也都纷纷拥抱Docker,例如Openstack、Mesos、Cloud Foundry等等,我们也看到国内外各个云平台争先恐后的宣布支持Docker。

不过,对于企业来说,最容易用上Docker的场景,我认为还是用Docker来搭建私有云,以及把Docker用在持续集成平台上。

资料来源:

  1. 名词定义: https://www.cnblogs.com/sammyliu/p/5878973.html
  2. 发展历程:

    CSDN社区

    https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/91469785
  3. 适用场景:CSDN社区 https://www.csdn.net/article/2015-03-30/2824347