Docker 与虚拟机有何不同?

我不断阅读Docker 文档,以尝试了解 Docker 和完整 VM 之间的区别。它如何提供完整的文件系统,隔离的网络环境等而又不那么繁重?

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

答案

Docker 最初使用LinuX 容器 (LXC),但后来切换到runC (以前称为libcontainer ),后者与主机运行在相同的操作系统中。这使它可以共享许多主机操作系统资源。此外,它使用分层文件系统( AuFS )并管理网络。

AuFS 是分层的文件系统,因此您可以具有合并在一起的只读部分和写入部分。可以使操作系统的公共部分为只读(并在所有容器之间共享),然后为每个容器提供自己的安装架以进行写入。

因此,假设您有一个 1 GB 的容器映像;如果要使用完整的 VM,则需要具有 1 GB x 所需数量的 VM。使用 Docker 和 AuFS,您可以在所有容器之间共享 1 GB 的大部分空间;如果您有 1000 个容器,则容器 OS 的空间可能仍然只有 1 GB 以上(假设它们都运行相同的 OS 映像) 。

完整的虚拟化系统会为其分配自己的资源集,并且共享最少。您将获得更多的隔离,但是隔离会更重(需要更多资源)。使用 Docker 可以减少隔离,但是容器重量轻(需要较少的资源)。因此,您可以轻松地在主机上运行数千个容器,并且它甚至不会闪烁。尝试使用 Xen 来做到这一点,除非您拥有非常庞大的主机,否则我认为不可能。

完整的虚拟化系统通常需要几分钟的时间来启动,而 Docker / LXC / runC 容器则需要几秒钟,甚至不到一秒钟。

每种类型的虚拟化系统各有利弊。如果要使用有保证的资源进行完全隔离,则必须使用完整的 VM。如果您只是想将进程彼此隔离,并希望在合理大小的主机上运行大量进程,那么 Docker / LXC / runC 似乎是可行的方法。

有关更多信息,请查看这组博客文章 ,它们可以很好地解释 LXC 的工作原理。

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

部署一致的生产环境说起来容易做起来难。即使您使用ChefPuppet 之类的工具,也始终会在主机和环境之间进行 OS 更新以及其他更改。

Docker 使您能够将操作系统快照到共享映像中,并使其易于部署在其他 Docker 主机上。在本地,dev,qa,prod 等:全都相同。当然,您可以使用其他工具来做到这一点,但并不那么容易或快速。

这非常适合测试;假设您有成千上万个需要连接到数据库的测试,并且每个测试都需要数据库的原始副本,并将对数据进行更改。经典的方法是在每次测试后使用自定义代码或使用Flyway 之类的工具重置数据库 - 这可能非常耗时,并且意味着测试必须串行运行。但是,使用 Docker 可以创建数据库的映像并为每个测试运行一个实例,然后并行运行所有测试,因为您知道它们都将针对数据库的同一快照运行。由于测试是在 Docker 容器中并行运行的,因此它们可以同时在同一盒子上运行,并且应该更快地完成。尝试使用完整的 VM 进行操作。

来自评论...

有趣!我想我仍然对 “快照操作系统” 的概念感到困惑。如果不制作操作系统映像,该怎么办?

好吧,让我们看看是否可以解释。您从基础映像开始,然后进行更改,然后使用 docker 提交这些更改,然后创建一个映像。该图像仅包含与基准的差异。当您要运行映像时,您还需要基础,它使用分层的文件系统在基础之上分层映像:如上所述,Docker 使用 AuFS。 AuFS 将不同的层合并在一起,您将获得所需的内容。您只需要运行它。您可以继续添加越来越多的图像(图层),它将继续仅保存差异。由于 Docker 通常基于注册表中的现成映像构建,因此您几乎不必自己 “快照” 整个操作系统。

好答案。只是要获得容器与 VM 的图像表示,请看下面的图像。

在此处输入图片说明

资源

了解虚拟化和容器如何在低级别工作可能会有所帮助。这将清除很多事情。

注意:我在下面的描述中做了一些简化。有关更多信息,请参见参考。

虚拟化如何在低层工作?

在这种情况下,VM 管理器将接管 CPU 环 0(或较新的 CPU 中的 “根模式”),并拦截来宾 OS 进行的所有特权调用,从而造成幻觉,即来宾 OS 具有自己的硬件。有趣的事实:在 1998 年之前,人们认为在 x86 架构中不可能实现这一目标,因为没有办法进行这种拦截。 VMWare 的人们是第一个想到重写内存中的可执行字节以供来宾 OS 进行特权调用的想法的人。

最终结果是虚拟化允许您在同一硬件上运行两个完全不同的 OS。每个来宾 OS 都要进行引导,加载内核等所有过程。您可以具有非常严格的安全性,例如,来宾 OS 无法获得对主机 OS 或其他来宾的完全访问权限并弄乱了事情。

容器如何在低级别工作?

2006 年左右,包括 Google 的一些员工在内的人们实现了新的内核级功能,即名称空间 (然而,这个想法 在 FreeBSD 中就已存在 )。操作系统的一项功能是允许将诸如网络和磁盘之类的全局资源共享给进程。如果将这些全局资源包装在名称空间中,以便它们仅对在相同名称空间中运行的那些进程可见,该怎么办?说,您可以获得一块磁盘并将其放入命名空间 X 中,然后在命名空间 Y 中运行的进程无法看到或访问它。同样,名称空间 X 中的进程无法访问分配给名称空间 Y 的内存中的任何内容。当然,X 中的进程无法查看或与名称空间 Y 中的进程对话。这为全局资源提供了一种虚拟化和隔离。这是码头工人的工作原理:在自己的命名空间每个容器运行,但使用完全相同的内核,因为所有其他容器。发生隔离是因为内核知道分配给进程的名称空间,并且在 API 调用期间它确保进程只能访问其自己的名称空间中的资源。

容器与 VM 的局限性现在应该很明显:您不能像 VM 中那样在容器中运行完全不同的 OS。但是,您可以运行不同的 Linux 发行版,因为它们确实共享相同的内核。隔离级别不如 VM 中强。实际上,在早期的实现中,有一种 “来宾” 容器接管主机的方法。您还可以看到,加载新容器时,操作系统的整个新副本不会像在 VM 中那样启动。所有容器共享相同的内核 。这就是为什么容器重量轻的原因。同样与 VM 不同,您不必为容器预先分配大量内存,因为我们没有运行新的 OS 副本。这样一来,就可以在一个操作系统上运行数千个容器,同时对它们进行沙盒处理,如果我们在自己的 VM 中运行单独的 OS 副本,则可能无法做到。

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

但我想补充一点,这里不再详细介绍。我认为 Docker 在整个过程中也有所不同。与 VM 相比,Docker 并非(仅)与硬件的最佳资源共享有关,而且它为打包应用程序提供了一个 “系统”(最好但不是必须的,作为一组微服务)。

对我来说,它恰好适合 rpm, Debian软件包, Maven ,npm + Git 等面向开发人员的工具,以及Puppet ,VMware,Xen 等 ops 工具之间的差距。

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

您的问题假设某个一致的生产环境。 但是如何保持一致呢?考虑流水线中的某些数量的服务器和应用程序(> 10)。

为了保持同步,您将开始使用诸如 Puppet, Chef或您自己的配置脚本,未发布的规则和 / 或大量文档等内容。理论上,服务器可以无限期地运行,并且可以保持完全一致和最新。实践无法完全管理服务器的配置,因此存在很大的配置漂移范围以及对运行中的服务器进行的意外更改。

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

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

最后,您甚至甚至可以在 Linux 笔记本电脑上重现复杂的生产环境(如果在您的情况下不起作用,请不要打电话给我;)

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

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

Docker 不是一种虚拟化方法。它依赖于实际上实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker 最初使用 LXC 驱动程序,然后移至 libcontainer,现在将其重命名为 runc。 Docker 主要致力于自动化应用程序容器内应用程序的部署。应用程序容器旨在打包和运行单个服务,而系统容器旨在运行多个进程,例如虚拟机。因此,Docker 被视为容器化系统上的容器管理或应用程序部署工具。

为了了解它与其他虚拟化有何不同,让我们看一下虚拟化及其类型。然后,将更容易理解那里的区别。

虚拟化

在其设想的形式中,它被认为是一种逻辑上划分大型机以允许多个应用程序同时运行的方法。但是,当公司和开放源代码社区能够提供一种以一种或另一种方式处理特权指令的方法,并允许在单个基于 x86 的系统上同时运行多个操作系统时,情况发生了巨大变化。

管理程序

系统管理程序处理创建来宾虚拟机在其上运行的虚拟环境。它监督来宾系统,并确保根据需要将资源分配给来宾。虚拟机管理程序位于物理机和虚拟机之间,并为虚拟机提供虚拟化服务。为了实现它,它拦截了虚拟机上的来宾操作系统操作,并模拟了主机操作系统上的操作。

虚拟化技术的快速发展(主要是在云中)通过允许在虚拟机管理程序(例如 Xen,VMware Player,KVM 等)的帮助下在单个物理服务器上创建多个虚拟服务器,进一步推动了虚拟化的使用。在商用处理器(例如 Intel VT 和 AMD-V)中整合了硬件支持。

虚拟化类型

可以基于虚拟化方法如何将硬件模拟为来宾操作系统并模拟来宾操作系统来对其进行分类。主要有三种虚拟化类型:

  • 仿真
  • 半虚拟化
  • 基于容器的虚拟化

仿真

仿真(也称为完全虚拟化)完全在软件中运行虚拟机 OS 内核。这种类型的管理程序称为类型 2 管理程序。它安装在主机操作系统的顶部,该主机操作系统负责将来宾 OS 内核代码转换为软件指令。翻译完全由软件完成,不需要硬件。通过仿真,可以运行支持仿真环境的任何未修改的操作系统。这种虚拟化的缺点是额外的系统资源开销,与其他类型的虚拟化相比,这会导致性能下降。

仿真

此类别中的示例包括 VMware Player,VirtualBox,QEMU,Bochs,Parallels 等。

半虚拟化

半虚拟化也称为 Type 1 虚拟机管理程序,直接在硬件或 “裸机” 上运行,并直接向其上运行的虚拟机提供虚拟化服务。它可以帮助操作系统,虚拟化硬件和实际硬件进行协作以实现最佳性能。这些虚拟机管理程序通常占用空间很小,并且本身不需要大量资源。

此类别中的示例包括 Xen,KVM 等。

半虚拟化

基于容器的虚拟化

基于容器的虚拟化,也称为操作系统级虚拟化,可在单个操作系统内核中实现多个隔离的执行。它具有最佳的性能和密度,并具有动态资源管理功能。这种虚拟化提供的隔离的虚拟执行环境称为容器,可以看作是一组跟踪的进程。

基于容器的虚拟化

通过添加到 Linux 内核版本 2.6.24 的名称空间功能,可以使容器的概念成为可能。容器将其 ID 添加到每个进程,并将新的访问控制检查添加到每个系统调用。它由clone()系统调用访问,该系统调用允许创建先前全局名称空间的单独实例。

命名空间可以以许多不同的方式使用,但是最常见的方法是创建一个隔离的容器,该容器不具有可见性或对容器外部对象的访问。尽管容器内运行的进程与位于其他名称空间中的进程(与其他类型的对象相同)共享底层内核,但它们似乎在普通的 Linux 系统上运行。例如,当使用命名空间时,容器内的 root 用户不会被视为容器外的 root 用户,从而增加了安全性。

Linux Control Groups(cgroups)子系统是实现基于容器的虚拟化的下一个主要组件,用于对进程进行分组并管理其总资源消耗。它通常用于限制容器的内存和 CPU 消耗。由于容器化的 Linux 系统只有一个内核,并且内核对容器具有完全的可见性,因此只有一层资源分配和调度。

几种管理工具可用于 Linux 容器,包括 LXC,LXD,systemd-nspawn,lmctfy,Warden,Linux-VServer,OpenVZ,Docker 等。

容器与虚拟机

与虚拟机不同,容器不需要启动操作系统内核,因此可以在不到一秒钟的时间内创建容器。与其他虚拟化方法相比,此功能使基于容器的虚拟化独树一帜。

由于基于容器的虚拟化几乎不给主机增加任何开销,因此基于容器的虚拟化具有近乎原生的性能

对于基于容器的虚拟化,与其他虚拟化不同,不需要其他软件。

主机上的所有容器共享主机的调度程序,从而节省了额外的资源。

与虚拟机映像相比,容器状态(Docker 或 LXC 映像)的大小较小,因此容器映像易于分发。

容器中的资源管理是通过 cgroups 实现的。 Cgroup 不允许容器消耗比分配给它们更多的资源。但是,到目前为止,主机的所有资源在虚拟机中都是可见的,但无法使用。这可以通过在容器和主机上同时运行tophtop来实现。在所有环境中的输出将看起来相似。

更新:

Docker 如何在非 Linux 系统中运行容器?

如果由于 Linux 内核中可用的功能而使容器成为可能,那么显而易见的问题是非 Linux 系统如何运行容器。适用于 Mac 和 Windows 的 Docker 均使用 Linux VM 运行容器。 Docker Toolbox 用于在 Virtual Box VM 中运行容器。但是,最新的 Docker 在 Windows 中使用 Hyper-V,在 Mac 中使用 Hypervisor.framework。

现在,让我详细描述 Docker for Mac 如何运行容器。

适用于 Mac 的 Docker 使用https://github.com/moby/hyperkit来模拟虚拟机监控程序功能,而 Hyperkit 在其核心中使用 hypervisor.framework。 Hypervisor.framework 是 Mac 的本机虚拟机管理程序解决方案。 Hyperkit 还使用 VPNKit 和 DataKit 分别命名网络和文件系统的名称空间。

Docker 在 Mac 中运行的 Linux VM 是只读的。但是,您可以通过运行以下命令对其进行重击:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

现在,我们甚至可以检查此 VM 的内核版本:

# uname -a Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux

所有容器都在此 VM 中运行。

hypervisor.framework 有一些限制。因此,Docker 在 Mac 中不会公开docker0网络接口。因此,您无法从主机访问容器。到目前为止, docker0仅在虚拟机内部可用。

Hyper-v 是 Windows 中的本机管理程序。他们还试图利用 Windows 10 的功能在本地运行 Linux 系统。

通过这篇文章,我们将画出 VM 和 LXC 之间的一些差异。首先定义它们。

虚拟机

虚拟机模拟物理计算环境,但是对 CPU,内存,硬盘,网络和其他硬件资源的请求由虚拟化层管理,该层将这些请求转换为底层物理硬件。

在这种情况下,VM 称为来宾,而其运行的环境称为主机。

LXC s:

Linux 容器(LXC)是操作系统级别的功能,可以在一个控制主机(LXC 主机)上运行多个隔离的 Linux 容器。 Linux 容器不需要 VM 虚拟机监控程序,因此可以作为 VM 的轻型替代方案。 Virtualbox,KVM,Xen 等

现在,除非您被 Alan(来自 Hangover 系列的 Zach Galifianakis)迷住了,并且去年去过拉斯维加斯,否则您将非常清楚 Linux 容器技术的巨大兴趣,如果我要专门介绍一个容器过去几个月在全球引起轰动的项目是– Docker 引起了一些共鸣的观点,即云计算环境应放弃虚拟机(VM),而用容器代替它们,因为它们的开销较低且可能具有更好的性能。

但是最大的问题是,是否可行?是否明智?

一种。 LXC 限于 Linux 实例。可能是不同风格的 Linux(例如,CentOS 主机上的 Ubuntu 容器,但仍是 Linux。)类似地,如果我们查看基于 VM 的虚拟机,它们的范围更广,并且使用虚拟机管理程序,您不仅限于 Linux 或 Windows 操作系统。

b。与 VM 相比,LXC 具有较低的开销并具有更好的性能。工具即。基于 LXC 技术的 Docker 为开发人员提供了一个运行其应用程序的平台,同时为操作人员提供了一种工具,使他们可以在生产服务器或数据中心上部署相同的容器。它试图使开发人员在运行应用程序,启动和测试应用程序与部署该应用程序的操作人员之间获得无缝的体验,因为这是所有麻烦的源头,DevOps 的目的是消除这些孤岛。

因此,最好的方法是云基础架构提供商应提倡适当使用 VM 和 LXC,因为它们各自适合处理特定的工作负载和方案。

到目前为止,放弃虚拟机是不切实际的。因此,VM 和 LXC 都有其各自的存在和重要性。

这里的大多数答案都谈论虚拟机。对于这个问题,我将给您一个单线答复,这在使用 Docker 的过去几年中对我的帮助最大。是这样的:

Docker 只是一种运行过程的理想方式,而不是虚拟机。

现在,让我解释一下这意味着什么。虚拟机是他们自己的野兽。我觉得解释Docker是什么比解释虚拟机更能帮助您理解这一点。特别是因为这里有许多很好的答案,可以准确地告诉您某人说 “虚拟机” 时的意思。所以...

Docker 容器只是一个进程(及其子进程),使用主机系统内核中的cgroup与其余进程进行分隔。您实际上可以通过在主机上运行ps aux来查看 Docker 容器进程。例如,启动apache2 “在容器” 刚开始apache2作为主机上的特殊工艺。它只是与机器上的其他进程分隔开的。重要的是要注意,在容器化过程的生命周期之外,容器不存在。进程死亡时,容器死亡。这是因为码头工人内容替换pid 1的容器内与您的应用( pid 1通常是 init 系统)。关于pid 1最后一点非常重要。

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

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

Docker 的发展非常快。它的文档是我见过的最好的文档。它通常是精心编写,简洁且准确的。我建议您查看可用的文档以获取更多信息,并信任您在线上阅读的所有文档(包括 Stack Overflow)。如果您有特定问题,我强烈建议在 Freenode IRC 上加入#docker并询问(您甚至可以使用 Freenode 的网络聊天 !)。

Docker 封装了具有所有依赖关系的应用程序。

虚拟器封装了可以运行通常可以在裸机上运行的任何应用程序的 OS。

他们俩都非常不同。 Docker 是轻量级的,并且使用 LXC / libcontainer(依赖于内核命名空间和 cgroup),并且没有诸如管理程序,KVM 之类的机器 / 硬件仿真。氙气很重。

Docker 和 LXC 的目的更多是用于沙箱,容器化和资源隔离。它使用主机操作系统(目前仅 Linux 内核)的克隆 API,该 API 为 IPC,NS(安装),网络,PID,UTS 等提供命名空间。

内存,I / O,CPU 等如何?这是使用 cgroups 控制的,您可以在其中创建具有特定资源(CPU,内存等)规范 / 限制的组,并将进程放入其中。在 LXC 之上,Docker 提供了一个存储后端( http://www.projectatomic.io/docs/filesystems/ ),例如,联合安装文件系统,您可以在其中添加层并在不同的安装名称空间之间共享层。

这是一项强大的功能,基本映像通常是只读的,只有容器在层中修改某些内容时,它才会将某些内容写入可读写分区(也称为写时复制)。它还提供了许多其他包装器,例如注册表和映像版本控制。

对于普通的 LXC,您需要附带一些 rootfs 或共享 rootfs,并且在共享时,更改会反映在其他容器上。由于这些附加功能很多,Docker 比 LXC 更受欢迎。 LXC 在嵌入式环境中很流行,用于围绕暴露于外部实体(例如网络和 UI)的流程实现安全性。 Docker 在期望一致的生产环境的云多租户环境中很流行。

普通 VM(例如 VirtualBox 和 VMware)使用虚拟机管理程序,并且相关技术具有专用固件(该固件成为第一个 OS(主机 OS 或来宾 OS 0)的第一层)或在主机 OS 上运行的软件,向来宾 OS 提供硬件仿真,例如 CPU,USB / 附件,内存,网络等。 VM(截至 2015 年)仍在高安全性多租户环境中流行。

Docker / LXC 几乎可以在任何便宜的硬件上运行(只要您有较新的内核,少于 1 GB 的内存也是可以的),而普通 VM 至少需要 2 GB 的内存,等等,以进行有意义的操作。但是主机操作系统上的 Docker 支持在 Windows 之类的操作系统(截至 2014 年 11 月)中不可用,其中可能在 Windows,Linux 和 Mac 上运行多种类型的 VM。

这是来自 docker / rightscale 的图片: 这是右比例的照片

1. 轻巧

这可能是许多 Docker 学习者的第一印象。

首先,Docker 映像通常比 VM 映像小,从而易于构建,复制和共享。

其次,Docker 容器可以在几毫秒内启动,而 VM 可以在数秒内启动。

2. 分层文件系统

这是 Docker 的另一个主要功能。图像具有图层,并且不同的图像可以共享图层,从而更加节省空间并加快构建速度。

如果所有容器都使用 Ubuntu 作为其基本映像,则不是每个映像都有其自己的文件系统,而是共享相同的下划线 ubuntu 文件,并且它们各自的应用程序数据不同。

3. 共享的操作系统内核

将容器视为流程!

主机上运行的所有容器的确是一堆具有不同文件系统的进程。它们共享相同的 OS 内核,仅封装系统库和依赖项。

这在大多数情况下是很好的(不需要额外的 OS 内核),但是如果在容器之间需要严格的隔离,则可能会成为问题。

为什么重要呢?

所有这些似乎都是改进,而不是革命。好吧, 定量积累会导致质变

考虑一下应用程序部署。如果要部署新软件(服务)或升级软件(服务),最好更改配置文件和流程,而不要创建新的 VM。因为创建具有更新服务的 VM,对其进行测试(在 Dev 和 QA 之间共享),部署到生产需要数小时甚至数天的时间。如果有任何问题,您必须重新开始,浪费更多时间。因此,请使用配置管理工具(木偶,盐堆,厨师等)来安装新软件,最好下载新文件。

对于 docker,不可能使用新创建的 docker 容器替换旧的 docker 容器。维护容易得多!构建新映像,与质量检查共享,进行测试,部署,只需几分钟(如果一切都是自动化的),在最坏的情况下只需几个小时。这被称为不可变基础架构 :不要维护(升级)软件,而是创建一个新的。

它改变了服务的交付方式。我们需要应用程序,但必须维护 VM(这很痛苦,与我们的应用程序无关)。 Docker 使您专注于应用程序并使所有事情变得顺利。