我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
当前回答
有很多答案可以更详细地解释这些差异,但这里是我非常简短的解释。
一个重要的区别是VM使用单独的内核来运行操作系统。这就是它很重并且需要时间引导的原因,消耗了更多的系统资源。
在Docker中,容器与主机共享内核;因此它重量轻,可以快速启动和停止。
在虚拟化中,资源是在设置开始时分配的,因此当虚拟机在许多时间内处于空闲状态时,资源没有得到充分利用。在Docker中,容器没有分配固定数量的硬件资源,可以根据需求自由使用资源,因此具有高度的可扩展性。
Docker使用UNION文件系统。。Docker使用写时复制技术来减少容器消耗的内存空间。在此处阅读更多信息
其他回答
1.重量轻
这可能是许多码头工人学习者的第一印象。
首先,docker映像通常比VM映像小,因此易于构建、复制和共享。
第二,Docker容器可以在几毫秒内启动,而VM可以在几秒钟内启动。
2.分层文件系统
这是Docker的另一个关键特性。图像具有图层,不同的图像可以共享图层,从而更节省空间,构建速度更快。
如果所有容器都使用Ubuntu作为它们的基本映像,那么不是每个映像都有自己的文件系统,而是共享相同的下划线Ubuntu文件,并且只在它们自己的应用程序数据上有所不同。
3.共享OS内核
将容器视为进程!
在主机上运行的所有容器实际上都是一堆具有不同文件系统的进程。它们共享相同的OS内核,只封装系统库和依赖项。
这在大多数情况下都很好(没有额外的OS内核维护),但如果容器之间需要严格隔离,则可能会出现问题。
为什么重要?
所有这些似乎都是进步,而不是革命。好吧,数量的积累导致质量的转变。
考虑应用程序部署。如果我们想部署一个新的软件(服务)或升级一个,最好是更改配置文件和进程,而不是创建一个新VM。因为创建一个具有更新服务的VM,测试它(开发人员和QA之间共享),部署到生产需要几个小时,甚至几天。如果出了什么问题,你必须重新开始,浪费更多的时间。因此,使用配置管理工具(木偶、盐堆、厨师等)安装新软件,最好下载新文件。
说到docker,不可能使用新创建的docker容器来替换旧容器。维护更容易!构建一个新映像,与QA共享,测试,部署它只需要几分钟(如果一切都是自动化的),最坏的情况下需要几个小时。这被称为不可变基础设施:不要维护(升级)软件,而是创建一个新的。
它改变了服务的交付方式。我们需要应用程序,但必须维护VM(这是一个难题,与我们的应用程序无关)。Docker让你专注于应用程序,让一切变得流畅。
Docker最初使用LinuX Containers(LXC),但后来改用runC(以前称为libcontainer),后者与主机在同一操作系统中运行。这允许它共享大量主机操作系统资源。此外,它使用分层文件系统(AuFS)并管理网络。
AuFS是一个分层文件系统,因此可以将只读部分和写部分合并在一起。可以将操作系统的公共部分设置为只读(并在所有容器中共享),然后为每个容器提供自己的装载以供编写。
假设您有一个1GB的容器映像;如果要使用完整的虚拟机,则需要有1 GB x所需数量的虚拟机。使用Docker和AuFS,您可以在所有容器之间共享1GB的空间,如果您有1000个容器,那么容器操作系统的空间可能只有1GB多一点(假设它们都运行同一个操作系统映像)。
一个完整的虚拟化系统得到了它自己的一组资源分配,并且实现了最小的共享。你得到了更多的隔离,但它更重(需要更多的资源)。使用Docker可以减少隔离,但容器是轻量级的(需要更少的资源)。因此,您可以轻松地在主机上运行数千个容器,而且它甚至不会闪烁。试着用Xen做这件事,除非你有一个非常大的主机,否则我认为这是不可能的。
一个完整的虚拟化系统通常需要几分钟的启动时间,而Docker/LXC/runC容器需要几秒钟,甚至不到一秒钟。
每种类型的虚拟化系统都有利弊。如果您希望使用有保证的资源进行完全隔离,那么完整的VM是最佳选择。如果您只想将进程彼此隔离,并希望在一个大小合理的主机上运行大量进程,那么Docker/LXC/runC似乎是一个不错的选择。
有关更多信息,请查看这组博客文章,它们很好地解释了LXC的工作原理。
为什么将软件部署到docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
部署一致的生产环境说起来容易做起来难。即使您使用Chef和Puppet等工具,主机和环境之间也总是会有操作系统更新和其他变化。
Docker使您能够将操作系统快照到共享映像中,并使其易于在其他Docker主机上部署。本地、dev、qa、prod等:都是相同的图像。当然,你可以用其他工具来完成这项工作,但不是那么容易或快速。
这非常适合测试;假设您有数千个测试需要连接到数据库,每个测试都需要数据库的原始副本,并将对数据进行更改。经典的方法是在每次测试后使用自定义代码或使用Flyway等工具重置数据库-这可能非常耗时,意味着测试必须连续运行。然而,使用Docker,您可以创建数据库的映像,并为每个测试运行一个实例,然后并行运行所有测试,因为您知道它们都将针对数据库的同一快照运行。由于测试是在Docker容器中并行运行的,它们可以在同一时间在同一个盒子上运行,并且应该完成得更快。尝试使用完整的虚拟机执行此操作。
来自评论。。。
有趣的我想我仍然对“快照操作系统”的概念感到困惑。如果不制作操作系统的图像,那么如何做到这一点?
好吧,看看我能不能解释一下。您从一个基本图像开始,然后进行更改,并使用docker提交这些更改,然后创建一个图像。此图像仅包含与基础的差异。当你想运行你的镜像时,你也需要基础,它使用一个分层文件系统将你的镜像分层在基础之上:如上所述,Docker使用AuFS。AuFS将不同的层合并在一起,您可以得到所需的内容;你只需要运行它。你可以继续添加越来越多的图像(层),它将继续只保存差异。由于Docker通常基于注册表中的现成图像构建,因此您很少需要自己“快照”整个操作系统。
通过这篇文章,我们将描绘虚拟机和LXC之间的一些区别。让我们先定义它们。
VM:
虚拟机模拟物理计算环境,但对CPU、内存、硬盘、网络和其他硬件资源的请求由虚拟化层管理,虚拟化层将这些请求转换为底层物理硬件。
在此上下文中,VM称为来宾,而其运行的环境称为主机。
LXC:
Linux容器(LXC)是操作系统级的功能,可以在一个控制主机(LXC主机)上运行多个独立的Linux容器。Linux容器是VM的轻量级替代品,因为它们不需要虚拟机管理程序,即Virtualbox、KVM、Xen等。
现在,除非你被艾伦(Zach Galifianakis,来自《宿醉》系列)麻醉,并在拉斯维加斯呆了一年,否则你会非常清楚Linux容器技术的巨大兴趣,如果我具体说一下,在过去几个月里在世界各地引起轰动的一个容器项目是Docker,它引发了一些回响,认为云计算环境应该放弃虚拟机(VM),并将其替换为容器,因为它们的开销更低,性能可能更好。
但最大的问题是,它可行吗?,这明智吗?
a.LXC的作用域是Linux的一个实例。它可能是不同风格的Linux(例如CentOS主机上的Ubuntu容器,但它仍然是Linux。)类似地,如果我们查看VM,基于Windows的容器现在被限定为Windows的一个实例,它们的范围非常广,并且使用管理程序,您不限于操作系统Linux或Windows。
b.与虚拟机相比,LXC开销低,性能更好。基于LXC技术构建的工具,即Docker,为开发人员提供了运行应用程序的平台,同时也为运营人员提供了一个工具,允许他们在生产服务器或数据中心上部署相同的容器。它试图让运行应用程序、启动和测试应用程序的开发人员与部署该应用程序的操作人员之间的体验无缝衔接,因为这是所有摩擦的所在,DevOps的目的是打破这些孤岛。
因此,最好的方法是云基础设施提供商应该提倡适当使用VM和LXC,因为它们都适合处理特定的工作负载和场景。
到目前为止,放弃虚拟机并不现实。因此,VM和LXC都有各自的存在和重要性。
我在生产环境和登台中使用过Docker。当你习惯了它,你会发现它对于构建一个多容器和隔离环境非常强大。
Docker是基于LXC(Linux容器)开发的,在许多Linux发行版中都能完美运行,尤其是Ubuntu。
Docker容器是隔离的环境。当您在Docker容器中发出top命令时,可以看到它,Docker容器是从Docker映像创建的。
此外,由于dockerFile配置,它们非常轻便和灵活。
例如,您可以创建一个Docker映像并配置一个DockerFile,然后告诉它,例如,当它运行时,运行wget“this”,apt-get“that”,运行“some shell script”,设置环境变量等等。
在微服务项目和架构中,Docker是一项非常可行的资产。您可以通过Docker、Docker swarm、Kubernetes和Docker Compose实现可伸缩性、弹性和弹性。
Docker的另一个重要问题是Docker Hub及其社区。例如,我使用Prometheus、Grafana、PrometheusJMXExporter和Docker实现了一个用于监控kafka的生态系统。
为此,我为zookeeper、kafka、Prometheus、Grafana和jmx收集器下载了已配置的Docker容器,然后使用YAML文件为其中一些容器安装了自己的配置,我更改了Docker容器中的一些文件和配置,并在一台机器上使用多容器Docker构建了一个用于监控kafka的完整系统,该系统具有隔离性、可扩展性和弹性,该架构可以轻松移动到多个服务器中。
除了Docker Hub站点之外,还有一个名为quay.io的站点,您可以使用它在那里创建自己的Docker图像仪表板,并将其推送到码头。您甚至可以将Docker图像从DockerHub导入码头,然后在自己的机器上从码头运行。
注意:学习Docker一开始看起来既复杂又困难,但当你习惯了它之后,你就不能没有它了。
我记得在使用Docker的第一天,我发出了错误的命令,或者错误地删除了我的容器和所有数据和配置。
好答案。为了获得容器与VM的图像表示,请查看下面的一个。
来源