Linux容器(LXC)是一种操作系统级虚拟化技术,使您能够在一台Linux机器(LXC主机)上同时创建和运行多个Linux操作系统(OS)。LXC提供了一组工具来管理容器,以及创建最常见Linux操作系统虚拟环境的模板。
Docker是一种开源的容器化技术,专注于在隔离环境中运行单个应用程序。它的Docker引擎使您能够创建、运行或分发容器。您还可以使用Docker Hub与其他开发人员共享应用程序和协作。
虽然LXC和Docker在架构和使用方面有很多共同之处,但它们在许多方面也有所不同。本文将比较它们的主机利用率、简单性、速度、安全性、易用性、可扩展性和工具。我们还将讨论这些工具的最佳特性及其缺点。
让我们先仔细看看上面列出的每个比较标准区域,并探索LXC和Docker在每个类别下是如何工作的。
LXC和Docker容器都与主机的内核通信。你可能会问,那又怎样?
共享主机系统的内核定义了一个容器,你可以在互联网上找到这个定义。原因是容器技术试图为虚拟机提供更好的替代方案。因此,流行的定义是与区分虚拟机(VM)和虚拟环境(VE,也称为容器技术)最相关的定义。
这些虚拟化技术(VM或VE)的不同之处在于它们如何使用主机。但是为了比较两种容器技术(VEs)——LXD和Docker,我们需要比第一种定义更深入一些。
在Linux中,内存分为内核空间和用户空间,内核空间是为负责管理CPU、内存和设备的操作系统核心保留的。
说LXC共享其主机的内核并不能说明全部情况。实际上,LXC容器正在使用Linux内核特性来创建隔离的进程和文件系统。
让我们看几个例子。在Linux中,可以使用ps命令列出正在运行的进程。如果您在LXC中运行东西并从主机上运行ps,您将看到一个正在运行的进程列表,包括您的容器(是的,从主机的角度来看,容器是最重要的进程)。但是,如果从LXC容器中运行相同的ps命令,则只会看到容器中启动的进程。LXC利用内核名称空间来实现此功能。
类似地,在Linux主机上,您有/bin,可执行文件的标准根目录。在容器的用户空间中,还有另一个/bin。容器的用户空间被捆绑在容器内部,可以被运送到不同的主机。这种用户空间隔离是在Ubuntu主机上安装Alpine Linux容器的原因,因为Linux容器中的程序与系统的其余部分是隔离的。LXC利用chroot来实现这一功能。
Docker在1.0版本之前使用LXC创建与主机系统的隔离。后来,Docker为LXC开发了自己的替代品,名为libcaontainer。这就是为什么Docker和LXC有这么多共同之处。
它为特定于机器的设置提供了一个抽象,例如网络、存储、日志等。这些是Docker引擎的一部分,使Docker容器更加便携,因为它们对底层物理机器的依赖更少。
Linux容器(LXC)在设计上更加灵活。它们更接近虚拟机——你可以像配置虚拟机一样,用LXC配置和安装任何东西。可以利用chroot、cgroups和名称空间等内核特性来创建LXC虚拟环境。这些内核机制有助于控制资源使用和进程在系统其余部分的可见性。
正如我们之前提到的,Docker容器最初是从LXC项目中派生出来的。然而,不同之处在于设计:Docker容器是专门为微服务应用程序设计的。这使得它们与虚拟机非常不同。Docker对于开发者来说使用起来很简单;网络、存储和日志抽象使得开发人员几乎不需要(或根本不需要)Linux的先验知识。
Docker为开发者提供的简单性正是它如此受欢迎的原因。这两个平台都使用简单,但针对不同的受众。
与虚拟机相比,LXC拥有更快的启动时间——它不需要打包整个操作系统和带有网络接口、虚拟处理器和硬盘驱动器的完整机器设置。
Docker容器也很轻,这大大提高了它们的速度。Docker为抽象存储和网络添加了一个额外的层,但在大多数情况下,您不应该看到由此导致的重大性能问题。创建和运行Docker容器需要几秒钟。因为Docker可以在已经初始化的现有操作系统上运行,所以几乎可以立即从其映像启动容器。
Docker默认支持分层容器。这意味着生成的容器是对文件系统所做更改的顺序组合,类似于Git历史记录。层可以并行下载,在多台机器上同时启动多个容器化应用程序时,这可以提高速度优势。
对Docker有利的一点是,现在的趋势是创建不受欢迎的Docker图像。使用distroless,您只需要应用程序、编译的代码和必要的绑定就可以了。LXC映像旨在复制Linux发行版,如Ubuntu、Debian或Alpine。Docker旨在打包单个应用程序,这一事实可能会让您在提供数百个容器时占据上风。
LXC和Docker之间的性能差异几乎微不足道。两者都提供快速启动时间。下载一个LXC映像可能比没有发行版本的Docker映像慢,但并非所有Docker映像都是无发行版本的,与LXC相比,Docker有改进的空间。
LXC丰富了安全配置,如组策略和默认AppArmor配置文件,以保护主机不被意外滥用容器内的权限。
Docker将操作系统与运行在其上的服务分离,以确保安全的工作负载,但Docker以root用户身份运行的事实可能会增加恶意软件的风险。这是因为Docker守护进程管理网络、容器、图像和卷等Docker对象,并处理Docker API请求,它也作为根用户在主机上运行。开发人员通常会审核Docker安装,以识别潜在的漏洞。
LXC将安全置于首位。它为您提供安全功能,包括Linux功能支持,以帮助您控制容器环境和托管的应用程序。Docker将不同的应用程序组件保存在不同的容器中的方法是一个优势。但是,如果您托管的是复杂的应用程序,可能需要有经验的安全工程师关注,那么这种策略也有其自身的安全缺点。
开始使用LXC很容易;它需要安装与Linux发行版兼容的LXC最新版本。这使得LXC命令、模板和python3绑定可用于创建容器。此外,LXC为每个容器运行一个标准操作系统单元,这意味着您的应用程序托管在一个标准的Linux操作系统中。这样,从裸机或虚拟机服务器迁移到LXC容器比迁移到Docker容器更容易管理。
另一方面,Docker使使用容器和运行程序变得容易。有了Docker,你可以将集装箱打包并运送到其他机器上使用。可以使用docker build命令从docker文件生成图像。作为一个开源容器平台,Docker的入门非常简单。你所需要的只是一个支持本地容器的操作系统,比如Linux、Docker for Mac/Windows或VirtualBox,安装在你的计算机上。
LXC和Docker都易于使用,并提供文档和指南来帮助您创建和部署容器。他们对Java和Python等语言的库和绑定的支持对开发人员来说是一个优势。
与Docker相比,LXC的可扩展性较差。它的图像不像Docker的图像那么轻量级。然而,LXC映像比物理机或虚拟机的映像更轻。这使得它非常适合按需资源调配和自动缩放。此外,可以使用LXC实现轻量级虚拟机,而无需虚拟机监控程序,这使得Linux容器成为一种可扩展的选项。
使用Docker,您可以将应用程序的功能分解到单独的容器中。例如,您可以在一个容器中运行Oracle数据库,同时运行Cassandra服务器和ASP。NET应用在其他单独的容器中。然后,您可以将这三个容器链接在一起,并创建一个应用程序,从而实现组件的独立缩放。
LXC工具允许您运行多个命令,使您能够管理创建、启动和删除LXC容器等任务。该工具还允许您重用在VirtualBox或其他虚拟化生产环境上运行的VM或裸机上使用的自动化脚本。有了这样一个可移植性特性,可以无缝地将应用程序从传统的Linux服务器迁移到Linux容器。
Docker命令行界面(CLI)是Docker工具的核心。它让你可以控制你的容器,允许你列出和管理图像。您还可以使用Docker注册表访问和分发常用应用程序的图像。
LXC和Docker工具都提供了重要的功能,以获得更好的开发人员体验。然而,每种工具都有一个突出的工具特性。LXC工具擅长将应用程序从传统的Linux服务器迁移到Linux容器。但如果你想优先考虑开发者体验,那就选择Docker。
现在,让我们进一步了解每个平台的一些细节,并从LXC开始总结每个平台的关键见解。
虽然LXC不是一个成熟的虚拟机,但它通过一个包含自己的用户空间和进程的虚拟环境提供操作系统级虚拟化。Linux容器依赖于Linux内核的功能来隔离容器。主机CPU将内存分配划分为名称空间,以控制RAM和CPU的使用。
LXC只绑定所需的应用程序/操作系统这一事实意味着裸机性能的提高。LXC虚拟环境允许您创建包含Linux发行版和应用程序的容器。在这种情况下,所有容器共享底层内核和硬件资源。
LXC为您提供了对它所基于的特性(名称空间、cgroup、chroot等)的大量控制。对于更多的技术受众,如系统管理员,这是一个巨大的优势。
LXC允许您轻松控制虚拟环境,同时提高应用程序的可移植性,并简化其在容器中的分发。
以简单的方式对一套应用程序进行测试升级和更改。您可以在几秒钟内创建一个克隆,在对更改感到满意时将其推出,并删除原始实例。
快速启动新实例并运行多个版本的web堆栈和应用程序。例如,在升级之前,你可以为特定的应用程序测试特定版本的Python或Ruby。
Docker旨在提高应用程序的可移植性。他们希望确保整个编程团队使用与生产环境相同的测试环境和配置。这种共享和使用应用程序的能力是Docker成功的关键因素,同时避免了经典的开发人员“它在我的机器上工作”的抱怨。
Docker发明了一种描述性格式Dockerfile,使容器的创建变得非常简单且易于维护。Dockerfile中的每条指令都会创建一个层,对容器映像所做的更改进行版本控制。
Docker包含一个用于存储、网络和日志记录的抽象层,使Docker容器易于配置和大规模使用。
Docker提供跨平台支持。虽然Docker容器最初是作为一种仅限Linux的技术开发的,但多亏了Docker Desktop,它现在可以在Windows和Mac上运行。使用Windows内核的Windows容器也是一个选项。
Docker容器图像由层组成。这提供了更好的性能(缓存和并行下载)和版本控制系统。
Docker容器不是为取代Linux机器而设计的。某些工作负载,例如有状态应用程序,可能无法从Docker功能中获益。
Docker没有提供LXC中可用的低级别控制。对一些人来说,这可能是一个不利因素。
LXC和Docker都是有效的容器技术,它们之间的选择取决于您的需求。
LXC是虚拟机的有力竞争者。因此,如果您正在开发Linux应用程序或使用服务器,并且需要一个真正的Linux环境,那么LXC应该是您的首选。
Docker是一个完整的应用程序分发解决方案,尤其受到开发人员的喜爱。Docker解决了本地开发人员的配置问题,并成为CI/CD管道中的一个关键组件,因为它在工作负载和可复制环境之间提供了隔离。
正如Docker扩展了LXC的功能,使其易于打包应用程序,并使其操作更方便开发人员一样,Docker在Dockerfile的基础上构建了Earthly,以创建更适合管理CI/CD工作负载的工具。一定要查看它,以帮助使用Docker或LXC自动化和简化开发流程。