Linux容器与Docker--有什么区别,为什么Docker更好?
在过去的几年里,容器在企业IT领域获得了很大的发展,大多数开发者似乎对这项技术非常感兴趣。许多人正在使用它们来开发并向公众部署应用程序。容器有很多有用的原因。
它们将应用程序和操作系统与系统的其他部分隔离,从而带来速度和灵活性。它们是可移植的,易于克隆和移动到其他操作系统。因此,容器或多或少可以由一个虚拟化的软件环境组成,应用程序或操作系统在主机上运行。
有几种你可以使用的容器技术。有[Docker容器],[Kubernetes容器],以及Linux容器(LXC)。本文将介绍和比较LXC与Docker容器。
什么是LXC,它的作用是什么?
[LXC]是[Linux内核容器功能]的一个用户空间接口。它使用复杂的API和简单的工具,使Linux用户更容易开发和维护系统或应用容器。
为了很好地理解LXC,我们首先讨论一下什么是[虚拟机]。
虚拟机(VM)的概念
通常,在虚拟机中,您有一个安装操作系统的主机。该操作系统可以是Windows、MacOS或Linux。当你使用虚拟机时,你在主机操作系统中添加或安装管理程序,如VirtualBox、VMware和ESXi。
你使用管理程序来安装一个客户操作系统,在你的主机操作系统之上运行。在这种情况下,客体操作系统是作为一个虚拟机/容器运行的。你添加的每个客户操作系统都是一个完整的操作系统。
连接到这些客体虚拟机的所有硬件资源(RAM、CPU、HDD/SSD)都是虚拟化的,管理程序负责以虚拟化的方式从你的基础/主机中分配所需的客体操作系统和硬件资源。
你创建了一个仿真器的实例,它可以像普通计算机一样与硬件进行交互。下面的图片描述了这个概念。

上面提到的主要问题是,每个运行的实例都需要分配资源,这可能导致可用资源的过度分配。操作系统的每个实例都必须有这些资源分配,即使服务器处于空闲状态,这些资源也会被使用。
如果你有16GB的RAM,并启动了4台Guest机器/服务器,它们将使用当前可用的所有RAM,即每个人被分配4GB的RAM。即使单个服务器只使用1GB的RAM。假设每个都能在1GB的RAM上运行,你只需要4GB的RAM来启动这四个虚拟主机。
然而,因为(它们所在的)实例被赋予了每一个4GB,它们在你的虚拟环境中使用了16GB的RAM。如果你要添加另一个虚拟主机,你将没有足够的RAM来启动它。每次虚拟机启动时,所有已经分配给它的资源都会自动给它。这些资源不能被分配给另一个客户主机。最后,你会有大量的资源被浪费掉。
另一个问题是,所有的客户操作实例都在一台机器上运行。如果有任何启动过程,或者无论何时你想因任何原因重新启动服务,你都必须重新启动整个计算机。根据你所处的环境,几秒钟的额外时间就会加起来。
LXC 虚拟环境 (VE)
LXC(一个Linux容器)是一个操作系统层面的虚拟化解决方案,能够创建和运行许多孤立的Linux虚拟环境(VE)。这些可以在一个集中的主机上旋转起来。容器是隔离级别的,可以隔离某些应用或模拟完全不同的主机。
LXC缓解了VM的缺点。Linux容器使主机CPU能够有效地将内存分配划分为被称为命名空间的限制级别。相比之下,虚拟机包含整个操作系统和机器设置/仿真器,如硬盘、虚拟CPU和网络接口。整个(巨大的)虚拟化环境通常需要一些时间来启动,并消耗大量的RAM和CPU。
LXC虚拟环境没有硬件预加载仿真。每个虚拟环境(操作系统或应用程序)都在容器中加载,执行时没有任何额外的开销,也没有硬件仿真。这意味着没有来自内存有限的软件的惩罚。最终,LXC将提高裸机的性能,因为它只捆绑了所需的操作系统/应用程序。

更简单地说,在LXC的虚拟环境(VE)中,你为服务、虚拟操作系统或应用程序创建容器。同时,底层的硬件资源和内核被所有的容器共享。例如,假设你有一个运行LAMP服务器(Linux, APACHE, MYSQL PHP)的容器。
在这种情况下,安装的软件、配置文件和IP地址都是虚拟化的。然而,这个容器并没有直接与它相关的内核和RAM(硬件资源)。它是在较低层次的基础金属上运行的。
换句话说,假设你有三个不同的容器,即一个LAMP服务器,一个DHCP容器,和一个DNS容器。在这种情况下,所有的配置文件都包含在这个容器中。而且它们都共享底层资源。在这种情况下,与虚拟机相比,资源分配将容易得多。
如果LAMP服务器需要大量的资源,可以分配给它。因此,如果DNS容器不需要大量的RAM,而LAMP服务器此刻需要额外的RAM,那未在DNS服务器中使用的额外内存就可以分配给LAMP服务器,以加快这个容器的服务速度。资源是根据每个容器的需要来分配的。
另一件需要注意的重要事情是,每个容器都包含在自己的配置文件中。每个容器都可以有它的IP地址和它的网络配置。你也可以去改变这些网络配置。
设置一个Linux服务器,你需要一个Linux操作系统,如Ubuntu。然后你安装Linux容器软件。安装后,你可以登录它,你会得到一个提示,看起来像其他的Linux客户端。
Docker 容器
Docker是一个容器化的虚拟环境,使开发、维护和部署应用程序和服务变得更加容易。Docker容器是非常轻的,你不必配置或设置虚拟机和环境,这意味着你在中间有管理程序。
Docker容器直接从主机操作系统上工作。从本质上讲,它没有一个单独的内核来运行其容器。它利用的是与主机操作系统相同的资源。Docker利用命名空间和控制组,让你更有效地使用主机操作系统资源。
让我们用一张图来解释这个问题。

上面的容器化概念有基础设施和一个操作系统加在里面。与LXC相比,没有客体操作系统。相反,它有一个直接在操作系统上运行的Docker demon。Docker demon有助于创建、运行和管理容器。
容器的每个实例运行一个进程(应用程序)。每个应用程序都是隔离的,运行时不会影响其他应用程序。因此,在这种情况下,每个应用程序都是与它的配置文件一起被容器化。
Docker demons允许容器从主机上回拨资源。在这种情况下,恶魔会根据一个容器需要运行的程度,为这个容器分配资源。
Linux和Docker容器之间的主要区别是什么?
LXC专注于操作系统容器化,而Docker则在应用容器化方面蓬勃发展。Docker是单一用途的应用虚拟化,而LXC是多用途的操作系统虚拟化。
在这种情况下,LXC专注于部署Linux虚拟机。容器就像一个具有完整功能的操作系统环境的虚拟机。然而,操作系统必须支持和处理Linux环境的特性和功能。你可以通过SSH进入LXC容器,把它当作操作系统来操作,并安装任何应用程序或服务,一切都会如期进行。
而Docker则不是这样。Docker专注于部署应用程序。Docker容器不是轻量级虚拟机。因此,它们不能被认为是这样。
Docker容器由于其架构而被限制在一个单一的应用程序中。虽然Docker在Linux环境下原生运行,但它并不完全依赖Linux,它支持其他操作系统,如Windows和MacOS。
为什么Docker更好?
可移植性
你可能听说过一句话,它在我的电脑上能用,但在你的电脑上不行。
考虑这样一个情况:一家公司雇用一个开发人员在Oracle的WebLogic软件上开发一个应用程序。这意味着开发者在电脑上安装了Oracle WebLogic。当应用程序完全开发完成后,开发人员将与团队分享这个应用程序,测试代码。
然后,该团队将不得不重复安装和配置Oracle WebLogic的过程。同样的应用程序会与生产团队共享,循环往复。
由于这三个层面上的环境差异,安装是分开进行的。这是Docker容器提供的最全面的解决方案之一。Docker会将这个单一的应用程序与应用程序运行所需的所有配置进行容器化。
其他团队只需要安装好Docker恶魔。然后,开发人员可以共享这个应用程序,而不需要安装额外的软件,无论其他团队在哪个操作系统。
Docker与版本管理相辅相成。当共享这个应用程序时,所使用的服务的版本不会改变。因此,整个应用程序将被共享而不会破坏代码。
灵活性
正如我们上面所解释的,Docker不分环境界限。Linux容器只支持基于Linux操作系统的容器化。因此,一个容器只能在一个环境中运行。而Docker则不是这样。如果它在你的电脑上运行,它在我的电脑上也会运行。
Docker引擎设置得很好,可以在所有环境中不断工作。如果你在基于Windows的服务器上设置一个应用程序,它可以很容易地被部署在Linux服务器上,而没有兼容性问题。
有了Docker容器,应用程序将在不同的计算机环境中高效、正确地工作。它可以很容易地在其他计算机环境中部署和执行,无论其主机操作系统或配置如何
高效地使用系统资源
Docker容器没有自己的内核,也没有虚拟内存和CPU,因此更容易直接利用主机基础设施的资源。没有增加资源分配的复杂性。资源是按需求提供的。一个应用程序只有在启动和运行时才使用资源。
如果它正在运行,Docker引擎的作用就是直接从主机的物理资源中为这个应用程序分配资源。你将能够在一个主机操作系统中旋转出比Linux容器多得多的Docker容器。
Docker引擎还允许你在共享资源的同时运行多个容器,并仍然保持隔离。在Docker中,一个应用程序是使用Docker镜像指定的。Docker允许你在先前创建的包之上构建或堆叠一个应用程序,这为组件的可用性提供了更大的可能性。
假设你需要创建许多实例,其中每个实例都需要Apache和MySQL。在这种情况下,你可以创建一个包括这两个组件的 "基础镜像",然后构建和生成更多已经安装了它们的实例。
轻量级和快速
你不需要设置管理程序,也不需要配置难以设置和部署的虚拟机镜像。也不需要架设客户操作系统。因此,Docker更快,更容易设置。为了进入你的应用程序,你不需要启动一个完整的操作系统。
Docker引擎有嵌入式配置管理命令,让你在几秒钟内启动/停止或重新启动一个容器。Docker容器占用的磁盘空间较少,没有复杂的配置需要设置,使其在执行应用程序时相对较快。
受欢迎程度
如果受欢迎程度是在这两种容器化解决方案中选择的唯一考虑因素,那么Docker将很容易击败LXC。Docker是在2013年推出的。在其早期阶段,Docker使用LXC,但随后修改了其代码库,创建了一个全新的容器架构。
许多IT巨头,包括Netflix、Twitter、谷歌和其他网络规模的组织,都接受了Docker的应用容器化策略,以获得其可扩展性的好处。据ZDNet报道,Docker的流行正在蓬勃发展,有超过350万个基于容器的应用程序和数十亿的容器协调分布使用Docker。
Docker受欢迎的原因之一是它用来与目标市场接轨的方法。容器的设计超越了LXC操作系统,进入了适合许多组织和企业的应用程序的更详细的领域。
结论
LXC提供了Linux上VE的优势,最明显的是能够将你的Linux操作系统相互隔离。与虚拟机相比,它是一种更便宜、更快速的构建方式,但它需要额外的Linux知识和经验。
另一方面,LXC的能力已经被Docker大大增强。Docker由于其明显的优势和分享及复制任何Docker创建的包的能力,正在获得越来越多的用户。它正在领先于虚拟机和VE。