谈容器

来源:互联网 发布:淘宝运动鞋店铺介绍 编辑:程序博客网 时间:2024/06/04 23:19

与FreeBSD的Jails和Solaris的zone一样,Linux容器是独立的执行环境,它们拥有独立的CPU、内存、阻塞I / O和网络资源,它们共享主机操作系统的内核。其结果是让人感觉像一台虚拟机,但却摆脱了虚拟化操作系统的所有额外负载和启动开销。

在一个大规模的系统中,运行VM意味着你可能运行了许多相同操作系统的重复实例和许多冗余的引导卷。因为与VM相比,容器更精简、更轻便,因此你可以在相同的硬件上运行6到8倍于vm的容器。

在具有web规模需求的应用程序环境中,与传统的服务器虚拟化相比,容器是一个吸引人的命题。

要理解容器,我们必须从Linux cgroups和名称空间开始,Linux内核特性是在容器和运行在主机上的其他进程之间创建隔离。最初由IBM开发的Linux名称空间封装了一组系统资源,并将它们呈现在一个过程中,使其看起来像是专门用于这个过程的。

最初由谷歌开发的Linux cgroups管理系统资源的隔离和使用,例如CPU和内存,用于一组进程。例如,如果你有一个占用大量CPU周期和内存的应用程序,比如一个科学计算应用程序,你可以将应用程序放到一个cgroup中,以限制其CPU和内存使用。

名称空间处理单个进程的资源隔离,而cgroups管理一组进程的资源。

从LXC到Docker

最初的Linux容器技术是Linux容器,通常称为LXC。LXC是一种Linux操作系统级虚拟化方法,用于在单个主机上运行多个孤立的Linux系统。名称空间和cgroups使LXC成为可能。

容器将应用程序与操作系统分离,这意味着用户可以拥有一个干净且最小的Linux操作系统,并在一个或多个独立容器中运行其他操作。

另外,由于操作系统是从容器中抽象出来的,因此可以跨任何支持容器运行时环境的Linux服务器移动容器。

Docker最初是一个构建单应用LXC容器的项目,它向LXC引入了几个重要的变化,使容器更加便携和灵活。使用Docker容器,可以更快速、更容易地部署、复制、移动和备份工作负载,而不是使用虚拟机。基本上,Docker给任何能够运行容器的基础设施带来了类似云的的灵活性。

因此,Docker经常被认为是现代最流行的容器。我们将详细讨论Docker,并讨论Docker与LXC的不同之处。

深入容器

虽然Docker最初是作为一个开源项目来构建专门化的LXC,但它后来演变成它自己的容器运行时环境。在较高的级别上,Docker是一个Linux实用工具,可以高效地创建、发送和运行容器。

从根本上说,Docker和LXC容器都是用户空间的轻量级虚拟化机制,它们实现了cgroups和名称空间来管理资源隔离。然而,Docker容器和LXC之间存在一些关键区别。特别是:

单对多进程。Docker限制容器作为单个进程运行。如果你的应用程序环境由X并发流程组成,Docker希望你运行X容器,每个容器都有一个不同的进程。相比之下,LXC容器有一个常规的init进程,可以运行多个进程。

要在Docker中运行一个简单的多层web应用程序,需要一个PHP容器、一个Nginx容器(web服务器)、一个MySQL容器(用于数据库进程)和一些用于存储数据库表和其他应用程序数据的数据容器。

单进程容器的优点很多,包括简单的和更细粒度的更新。当你想要更新的是web服务器时,为什么要关闭数据库进程呢?而且,单进程容器代表了构建基于微服务的应用程序的高效架构。

单进程容器也有局限性。例如,你不能在容器内运行代理、日志脚本或SSH守护进程。此外,将小的应用程序级更改提交到单进程容器也不容易。您基本上被迫启动一个新的、更新的容器。

无状态和有状态。Docker容器被设计为无状态,比LXC更重要。首先,Docker不支持持久存储。Docker通过允许将主机存储作为“Docker卷”从容器中获得。因为卷被挂载,它们实际上并不是容器环境的一部分。

其次,Docker容器由只读层组成。这意味着,一旦容器映像被创建,它就不会改变。在运行时,如果容器中的进程对其内部状态进行更改,则在内部状态和创建容器的映像之间生成“diff”。如果运行docker commit命令,那么diff将成为新映像的一部分——不是原始镜像,而是一个新的镜像,可以从中创建新的容器。否则,如果删除容器,那么diff就会消失。

无状态容器是一个有趣的实体。可以对一个容器进行更新,但是一系列的更新将会产生一系列新的容器映像,因此系统回滚是很容易的。

可移植性。这可能是Docker在LXC上最重要的一个进步。Docker从应用程序中抽象出比LXC更多的网络、存储和操作系统细节。对于Docker,应用程序确实独立于这些底层资源的配置。当您将Docker容器从一个Docker主机转移到另一个启用Docker的机器时,Docker保证应用程序的环境将保持不变。

这种方法的一个直接好处是,Docker使开发人员能够建立与生产服务器完全相同的本地开发环境。当开发人员完成编写和测试他的代码时,他可以将其封装在一个容器中,并直接将其发布到AWS服务器或他的私有云,并且它将立即工作,因为环境是相同的。

即使使用LXC,开发人员也可以在他自己的机器上运行一些东西,但是发现它在向服务器部署时不能正常运行;服务器环境将是不同的,要求开发人员花费大量的时间来调试差异并解决问题。

Docker消除了这种复杂性。这就是Docker容器的便携性和易于在不同的云和虚拟化环境中使用的原因。

开发者友好架构

将应用程序与底层硬件分离是虚拟化背后的基本概念。容器更进一步,将应用程序从底层操作系统中分离出来。这使cloudlike灵活,包括可移植性和有效的伸缩性。容器带来了另一个级别的效率、可移植性和部署灵活性,而不是虚拟化。

容器的普及强调了一个事实,即这是一个由开发者驱动的时代。如果云是关于基础设施创新和可用性创新的移动,那么容器是开发人员急需的力量倍增器。