Linux 容器是一个在单一 Linux 主机上提供多个隔离的 Linux 环境的操作系统级虚拟技术。不像虚拟机(VM),容器并不需要运行专用的访客(guest)操作系统。容器们共享宿主机的(host)操作系统内核,并使用访客操作系统的系统库来提供所需的功能。由于不需要专用的操作系统,因此容器要比虚拟器启动快得多。

Virtual Machines Vs Containers

(图片来自: Docker Inc.)

转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/178.html?1456925793

容器借助 Linux 内核的 Namespaces、Apparmor、SELinux 情景模式(profile)、chroot 和 CGroup 等功能来提供类似于虚拟机的隔离环境。Linux 的安全模块可以确保正确地控制容器对宿主机和内核的访问,从而避免各种入侵活动。此外,在宿主机上可以运行不同的 Linux 发行版,只要它们运行在同样的 CPU 架构下。

简单来说,容器提供的是一种基于各种 Linux 发行版创建容器镜像的方法、一套管理容器生命周期的 API、与该 API 交互的客户端工具、保存快照的功能、在宿主机之间迁移容器实例的能力,等等。

容器历史

以下是容器简史,内容来自维基百科及其它来源:

1979 — chroot

容器的概念始于 1979 年的 UNIX  chroot,它是一个 UNIX 操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录。这个功能的想法是为每个进程提供独立的磁盘空间。其后在 1982年,它被加入到了 BSD 系统中。

2000 — FreeBSD Jails#p#分页标题#e#

FreeBSD Jails 是最早的容器技术之一,它由 R&D Associates 公司的 Derrick T. Woolworth 在 2000 年为 FreeBSD 引入。这是一个类似 chroot 的操作系统级的系统调用,但是为文件系统、用户、网络等的隔离增加了进程沙盒功能。因此,它可以为每个 jail 指定 IP 地址、可以对软件的安装和配置进行定制,等等。

2001 — Linux VServer

Linux VServer 是另外一种 jail 机制,它用于对计算机系统上的资源(如文件系统、CPU 处理时间、网络地址和内存等)进行安全地划分。每个所划分的分区叫做一个安全上下文(security context),在其中的虚拟系统叫做虚拟私有服务器(virtual private server,VPS)。

2004 — Solaris Containers

Solaris Containers 支持在 x86 和 SPARC 系统,首次出现在 2004 年 2 月发布的 Solaris 10 的 build 51 beta 上,其后完整发布在 2005 年的 Solaris 10 上。 Solaris Container 是由系统资源控制和通过 zones 提供的边界分离(boundary separation)所组合而成的。zones 是一个单一操作系统实例中的完全隔离的虚拟服务器。

2005 — OpenVZ

OpenVZ 类似于 Solaris Containers,它通过对 Linux 内核进行补丁来提供虚拟化、隔离、资源管理和状态检查(checkpointing)。每个 OpenVZ 容器都有一套隔离的文件系统、用户及用户组、进程树、网络、设备和 IPC 对象。

2006 — Process Containers

Process Containers 是由 Google 在 2006 年实现的,用于对一组进程进行限制、记账、隔离资源使用(CPU、内存、磁盘 I/O、网络等)。后来为了避免和 Linux 内核上下文中的“容器”一词混淆而改名为 Control Groups。它被合并到了 2.6.24 内核中。这表明 Google 很早就参与了容器技术的开发,以及它们是如何回馈到社区的。

2007 — Control Groups

如上面所述,Control Groups (即  cgroups)是由 Google 实现的,并于 2007 年加到了 Linux 内核中。#p#分页标题#e#

2008 — LXC

LXC 的意思是 LinuX Containers,它是第一个最完善的 Linux 容器管理器的实现方案,是通过 cgroups 和 Linux 名字空间(namespace)实现的。LXC 存在于 liblxc 库中,提供了各种编程语言的 API 实现,包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。与其它容器技术不同的是, LXC 可以工作在普通的 Linux 内核上,而不需要增加补丁。现在 LXC project 是由 Canonical 公司赞助并托管的。

2011 — Warden

Warden 是由 CloudFoundry 在 2011 年开发的,开始阶段是使用的 LXC,之后替换为他们自己的实现方案。不像 LXC,Warden 并不紧密耦合到 Linux 上,而是可以工作在任何可以提供隔离环境的操作系统上。它以后台守护进程的方式运行,为容器管理提供了 API。请参考 Warden 文档和这个博客文章了解更多。

2013 — LMCTFY

lmctfy 的意思是“让我为你包含(Let Me Contain That For You)”。这是一个 Google 容器技术的开源版本,提供 Linux 应用容器。Google 启动这个项目旨在提供性能可保证的、高资源利用率的、资源共享的、可超售的、接近零消耗的容器(参考自:lmctfy 演讲稿)。现在为 Kubernetes 所用的 cAdvisor 工具就是从 lmctfy 项目的成果开始的。lmctfy 首次发布于 2013 年10月,在 2015 年 Google 决定贡献核心的 lmctfy 概念,并抽象成 libcontainer,因此,lmctfy 现在已经没有活跃的开发了。

lincontainer 项目最初由  Docker 发起,现在已经被移交给了开放容器基金会(Open Container Foundation)。

2013 — Docker

Docker 是到现在为止最流行和使用广泛的容器管理系统。它最初是一个叫做 dotCloud 的 PaaS 服务公司的内部项目,后来该公司改名为 Docker。类似 Warden,Docker 开始阶段使用的也是 LXC ,之后采用自己开发的 libcontainer 替代了它。不像其它的容器平台,Docker 引入了一整个管理容器的生态系统,这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰的 REST API、命令行等等。稍后的阶段, Docker 推动实现了一个叫做 Docker Swarm 的容器集群管理方案。

2014 — Rocket#p#分页标题#e#

Rocket 是由 CoreOS 所启动的项目,非常类似于 Docker,但是修复了一些 Docker 中发现的问题。CoreOS 说他们的目的是提供一个比 Docker 更严格的安全性和产品需求。更重要的是,它是在一个更加开放的标准 App Container 规范上实现的。在 Rocket 之外,CoreOS 也开发了其它几个可以用于 Docker 和 Kubernetes的容器相关的产品,如:CoreOS 操作系统、etcd 和 flannel。

2016 — Windows Containers

微软 2015 年也在 Windows Server 上为基于 Windows 的应用添加了容器支持,它称之为 Windows Containers。它与 Windows Server 2016 一同发布。通过该实现, Docker 可以原生地在 Windows 上运行 Docker 容器,而不需要启动一个虚拟机来运行 Docker( Windows 上早期运行 Docker 需要使用 Linux 虚拟机)。

容器的未来

截止到今天(2016年1月),在行业内有一个显著趋势,部署软件应用从虚拟机逐渐移到了容器。其主要的原因是容器相比于虚拟机而言更加灵活和低消耗。Google 已经使用容器技术好多年了,它在 Borg 和 Omega 容器集群管理平台上可以成规模地运行 Google 应用。更重要的是,Google 为容器领域贡献了 cgroups 的实现和参与了 libcontainer 项目。Google 也在过去这些年借助容器在性能、资源利用和整体效率方面取得了巨大收益。最近,一直没有操作系统级的虚拟化技术的微软,也在 Window Server 上迅速采取动作实现了对容器的原生支持。

Docker 、Rocket 以及其它的容器平台并不能以一个单一主机运行在产品环境中,原因是这样面临着单点故障。当一组容器运行在一个单一宿主机时,如果宿主机失效,所有运行在该宿主机上的容器也会失效。要避免这个问题,应该使用容器宿主机集群。Google 借助其在 Borg 中取得的经验,开发了一个叫做  Kubernetes 的开源容器集群管理系统。Docker 也启动了一个叫做  Docker Swarm 的解决方案。目前这些解决方案还都处于相当早期的阶段,也许需要几个月或来年才实现完整的功能集合,才能变得稳定,从而广泛应用于行业内的产品环境中。

微服务(Microservices )是另一个突破性技术,在软件架构上可以将容器用于部署。微服务并不是一个新东西,只是一个相比标准的 Web 服务超快的轻量级 Web 服务。这是通过将功能单元(也许是一个单一服务或 API 方法)打包到一个服务中,并内嵌其到一个轻量级 Web 服务器软件中实现的。#p#分页标题#e#

通过对上面的介绍,我们可以预测接下来几年,容器也许会替代虚拟机,某些情况下也许会全部取代。去年我为一些企业在 POC 层面上实现了基于容器的解决方案。也有人想要在产品环境中尝试它们,这一天也许在容器集群管理系统进一步成熟后很快到来。

Linux 容器技术史话:从 chroot 到未来的更多相关文章

  1. linux容器技术之chroot

    linux容器技术之chroot linux chroot 机制的由来 root 用户启动一个daemon,必须用root 用户来启动,比如一个web 服务器(nginx/apapce 80端口)是在 ...

  2. linux容器技术和Docker

    linux容器技术和Docker 概述 Docker在一定程度上是LXC的增强版,早期的Docker使用LXC作为容器引擎,所以也可以说Docker是LXC的二次封装发行版,目前docker使用的容器 ...

  3. Linux 容器的使用

    Linux 容器的使用 Linux 容器在 v2.6.29版本之后就加入到内核之中了, 之前虽然也听说过, 但一直没有太留心, 一直使用 KVM 来创建虚拟机. 直至最近 Docker 大出风头, 才 ...

  4. Docker容器技术

    Docker介绍 什么是容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个系统镜像运行,并由该镜像提供支持进程所需的全部文件. 容器镜像包含了应用的所有依赖项,因而在从开发到测试再到生产 ...

  5. 容器技术之LXC

    什么是容器?在生活中我们常见的容器有各种瓶瓶罐罐.各种能够容纳其它物料的东西叫容器:容器的特点就是有着很好的隔离作用,使得不同的物料互相隔离:除此之外容器还方便运输.方便储存:这是生活中所说的容器,以 ...

  6. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  7. Docker容器技术基础

    Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...

  8. Docker容器技术-基础与架构

    一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...

  9. Cgroup maintainer丽泽范:解剖Linux核心容器技术

    摘要:Cgroup和namespace等内核特性如何出现,在社区处于如何的开发状况?Docker如火如荼.内核社区是否会因此加紧完好容器技术的隔离性安全性?华为Linux内核高级project师李泽帆 ...

随机推荐

  1. LeetCode OJ-- 二战 Combinations

    在1 - 10 中,求出 7 个数的排列组合. 出现了超时,而超时的原因是有好多重复情况,复杂度上来说,和答案的复杂度是一样的,但是答案中重复了太多了,体会下. 超时1: class Solution ...

  2. kettle(6.0)如何连接远程集群(CDH5.1)?

    最近因为公司业务需要,刚刚接触了kettle.这不看不知道,一看才发现kettle的功能是在是太强大了,让我有种相见恨晚的感觉.由于主要是应用kettle与hadoop集群和hive连接进行数据处理. ...

  3. C# 部分语法总结(入门经典)

    class Program { static void Main(string[] args) { init(); System.Console.ReadKey(); } #region 接口 /// ...

  4. MemCached 安装笔记

    安装步骤: 1. 下载libevent & memcached 源码包 分别把memcached和libevent下载回来,放到 /tmp 目录下: # cd /tmp     # wget ...

  5. 数据分析和R语言的那点事儿_1

    最近遇到一些程序员同学向我了解R语言,有些更是想转行做数据分析,故开始学习R或者Python之类的语言.在有其他编程语言的背景下,学习R的语法的确是一件十分简单的事.霸特,如果以为仅仅是这样的话那就图 ...

  6. 如何编写高效的jQuery代码

    jQuery的编写原则: 一.不要过度使用jQuery 1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大.所以有原生方法可以使用的场 ...

  7. 『TCP/IP详解——卷一:协议』读书笔记——11

    2013-08-23 20:00:18 第4章 ARP:地址解析协议 4.1 引言 ARP(Address Resolution Protocol,地址解析协议)是获取物理地址的一个TCP/IP协议. ...

  8. uva 11137 Ingenuous Cubrency

    // uva 11137 Ingenuous Cubrency // // 题目大意: // // 输入正整数n,将n写成若干个数的立方之和,有多少种 // // 解题思路: // // 注意到n只有 ...

  9. 排列组合算法(PHP)

    用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...

  10. 父窗口window.showModalDialog传值 子窗口window.returnValue返回值

    父窗口打开子窗口页面: var fatherWindow = document.all.dealReason;//想传的值 win = window.showModalDialog(strUrl, f ...