我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?

为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?


当前回答

好答案。为了获得容器与VM的图像表示,请查看下面的一个。

来源

其他回答

我喜欢肯·科克伦的回答。

但我想补充一点观点,这里没有详细介绍。在我看来,Docker在整个过程中也有所不同。与虚拟机不同,Docker不仅仅是硬件的最佳资源共享,而且它还为打包应用程序提供了一个“系统”(作为一组微服务是可取的,但不是必须的)。

对我来说,它正好填补了面向开发人员的工具(如rpm、Debian包、Maven、npm+Git)与操作工具(如Puppet、VMware、Xen)之间的差距,你可以这么说。。。

为什么将软件部署到docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?

您的问题假定了某种一致的生产环境。但如何保持一致?考虑一些数量(>10)的服务器和应用程序,这是管道中的阶段。

为了保持同步,您将开始使用类似木偶、厨师或您自己的供应脚本、未发布的规则和/或大量文档。。。理论上,服务器可以无限期运行,并保持完全一致和最新。实践无法完全管理服务器的配置,因此存在很大的配置漂移和运行服务器的意外更改空间。

因此,有一种已知的模式可以避免这种情况,即所谓的不可变服务器。但不可变的服务器模式并不受欢迎。主要是因为Docker之前使用的VM的限制。处理几个千兆字节的大图像,移动这些大图像,只是为了改变应用程序中的一些字段,这是非常费力的。可以理解。。。

有了Docker生态系统,你永远不需要在“小改动”上移动千兆字节(感谢aufs和Registry),也不必担心在运行时将应用程序打包到Docker容器中会导致性能下降。您不必担心该图像的版本。

最后,即使在您的Linux笔记本电脑上,您也可以经常复制复杂的生产环境(如果在您的情况下不起作用,请不要打电话给我;)

当然,您可以在VM中启动Docker容器(这是一个好主意)。减少VM级别的服务器资源调配。所有这些都可以由Docker管理。

同时Docker使用自己的实现“libcontainer”而不是LXC。但LXC仍然可用。

这里的大多数答案都涉及虚拟机。我将给你一个简单的回答,这个问题在过去几年中对我的帮助最大。是这样的:

Docker只是运行进程的一种奇特方式,而不是虚拟机。

现在,让我再解释一下这意味着什么。虚拟机是它们自己的野兽。我觉得解释Docker是什么比解释虚拟机更能帮助你理解这一点。特别是因为这里有很多很好的答案,告诉你某人说“虚拟机”的确切含义。所以

Docker容器只是一个进程(及其子进程),它使用主机系统内核内的cgroups与其他进程进行划分。通过在主机上运行ps aux,您实际上可以看到Docker容器进程。例如,“在容器中”启动apache2只是将apache2作为主机上的一个特殊进程启动。它只是与机器上的其他过程分开了。需要注意的是,容器不存在于容器化流程的生命周期之外。当你的进程失效时,你的容器也会失效。这是因为Docker将容器中的pid 1替换为应用程序(pid 1通常是init系统)。关于pid 1的最后一点非常重要。

就每个容器进程所使用的文件系统而言,Docker使用UnionFS支持的映像,这是您在Docker拉ubuntu时下载的映像。每个“图像”只是一系列层和相关元数据。分层的概念在这里非常重要。每一层都只是其下一层的变化。例如,当你在构建Docker容器时删除Dockerfile中的一个文件时,你实际上只是在最后一层的上面创建一个层,上面写着“该文件已被删除”。顺便说一句,这就是为什么您可以从文件系统中删除一个大文件,但映像仍然占用相同的磁盘空间。文件仍然存在,在当前文件下面的层中。层本身只是文件的tarball。您可以使用docker save--output/tmp/ubuntu.tar-ubuntu和cd/tmp&&tar-xvf-ubuntu.tar来测试这一点。然后您可以四处看看。所有看起来像长散列的目录实际上都是单独的层。每一个都包含文件(layer.tar)和元数据(json)以及有关该特定层的信息。这些层只是描述文件系统的更改,这些更改保存为“在”原始状态之上的层。当读取“当前”数据时,文件系统读取数据时,就像只查看最顶层的更改一样。这就是为什么文件看起来被删除了,尽管它仍然存在于“先前”层中,因为文件系统只查看最顶层。这允许完全不同的容器共享其文件系统层,即使每个容器中最顶层的文件系统可能发生了一些重大变化。当容器共享其基本图像层时,这可以节省大量磁盘空间。但是,当您通过卷将目录和文件从主机系统装载到容器中时,这些卷会“绕过”UnionFS,因此更改不会存储在层中。

Docker中的网络是通过使用以太网桥(主机上称为docker0)和主机上每个容器的虚拟接口实现的。它在docker0中创建一个虚拟子网,用于容器之间的通信。这里有许多联网选项,包括为容器创建自定义子网,以及“共享”主机的网络堆栈以供容器直接访问的功能。

Docker进展很快。它的文档是我见过的最好的文档之一。它通常写得很好,简洁准确。我建议您查看可用的文档以获取更多信息,并将文档置于在线阅读的任何其他内容之上,包括堆栈溢出。如果你有具体的问题,我强烈建议加入Freenode IRC上的#docker并在那里提问(你甚至可以使用Freenode的网络聊天!)。

docker文档(和自我解释)区分了“虚拟机”和“容器”。他们倾向于以一种不寻常的方式解释和使用事物。他们可以做到这一点,因为这取决于他们自己,他们在文档中写了什么,而且虚拟化的术语还没有真正准确。

事实是Docker文档对“容器”的理解,实际上是半虚拟化(有时是“OS级虚拟化”),而硬件虚拟化则相反,Docker不是。

Docker是一个低质量的虚拟化解决方案。容器与VM的区别是由docker开发人员发明的,以解释其产品的严重缺点。

它之所以如此流行,是因为他们“把火给了普通人”,也就是说,它使Win10工作站上典型的服务器(=Linux)环境/软件产品的简单使用成为可能。这也是我们容忍他们细微差别的原因。但这并不意味着我们也应该相信它。

Windows主机上的docker在HyperV中使用了嵌入式Linux,并且其容器已经在其中运行,这一事实使情况变得更加混乱。因此,Windows上的docker使用了硬件和半虚拟化相结合的解决方案。

简而言之,Docker容器是低质量(准)虚拟机,具有巨大的优势和许多缺点。

我在生产环境和登台中使用过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的第一天,我发出了错误的命令,或者错误地删除了我的容器和所有数据和配置。

通过这篇文章,我们将描绘虚拟机和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都有各自的存在和重要性。