Docker 容器如何工作
- 集装箱
- 什么是虚拟机?
- 虚拟化如何运作?
- 什么是容器?
- 什么是 Docker?
- 总结
五星上将麦克阿瑟曾经说过:在docker面前,虚拟机就是个弟弟
集装箱
《盒子:集装箱如何让世界变得更小,让世界经济变得更大》是马克·莱文森 (MarcLevinson)所著的一本书。它探讨了海运集装箱对全球贸易和世界经济的深远影响。
虽然运输容器的历史在有关 Docker 容器的讨论中似乎无关紧要,但它们的共同点比您想象的要多。
在集装箱运输出现之前,货物装卸是劳动密集型且耗时的,导致全球贸易效率低下和延误。抵达时的货物形状和尺寸各异,缺乏标准化包装使得有效堆叠和固定物品变得困难。
如果没有标准化集装箱,货物常常被随意存放在船舱或船坞中。这种对空间的低效利用意味着船舶无法运载尽可能多的货物,从而导致运输成本更高。
采用统一的集装箱尺寸和装卸程序,可以在不同的运输方式(船舶、卡车、火车和用于移动集装箱的起重机)之间无缝转移货物。
这种标准化是集装箱成功的关键。毕竟,如果一家公司的集装箱不适合另一家公司的船舶、卡车或货运列车,它们就无法正常运输。每家公司都需要自己的集装箱车队才能将物品发送给每个客户——这将是一场运营噩梦。
集装箱的标准化使其具有便携性,可以轻松地从一个地方移动到另一个地方。这种可移植性也是 Docker 容器的一个关键特性,我们将很快讨论。
什么是虚拟机?
虚拟机 (VM) 是通过称为虚拟化的过程创建的。
虚拟化是一项技术,允许您在单个物理计算机上创建多个模拟环境或某些事物的虚拟版本,例如操作系统、服务器、存储或网络。
这些虚拟环境的行为就好像它们是独立的、单独的实体一样,尽管它们共享底层物理系统的资源。
虚拟化就像有一顶魔术师的帽子,可以在里面变出多顶帽子。正如魔术师的帽子会造成一顶物理帽子出现许多帽子的错觉一样,虚拟化允许单个物理计算机或服务器显示为多个虚拟机 (VM),每个虚拟机都有自己的操作系统和资源。
VM 虚拟化硬件。这仅仅意味着虚拟机采用单个硬件(服务器)并创建运行自己的操作系统的其他服务器的虚拟版本。从物理上来说,它只是一个硬件。
从逻辑上讲,多个虚拟机可以在单个硬件上运行。这本质上是在一台计算机内运行的一台或多台计算机,如下所示。
虚拟化如何运作?
所以您可能想知道 – 虚拟化到底是如何工作的?看看下面的图片:
在基础上,您拥有主机硬件和操作系统。这是用于创建虚拟机的物理机。最重要的是,您还有虚拟机管理程序。这允许多个虚拟机(每个虚拟机都有自己的操作系统 (OS))在单个物理服务器上运行。
不过,虚拟机有一些缺点,容器可以解决这些缺点。有两个缺点尤其突出:
虚拟机消耗更多资源:由于需要为每个虚拟机运行完整的操作系统实例,因此虚拟机具有更高的资源开销。这可能会导致更大的内存和存储消耗。这反过来会对虚拟机的性能和启动时间产生负面影响。
可移植性:由于底层操作系统环境的差异,虚拟机通常不太可移植。在不同的虚拟机管理程序或云提供商之间移动虚拟机可能会更加复杂。
主要的云提供商都有虚拟机。对于AWS来说,它是EC2,GCP有计算引擎,Azure有Azure虚拟机。
什么是容器?
容器是一个轻量级、独立且可执行的软件包,其中包含运行软件所需的一切,包括代码、运行时、系统工具和库。
容器旨在隔离应用程序及其依赖项,确保它们可以在不同环境中一致运行。无论应用程序是从您的计算机运行还是在云中运行,应用程序的行为都保持不变。
与虚拟化硬件的虚拟机不同,容器虚拟化操作系统。这仅仅意味着容器使用单个操作系统来创建虚拟应用程序及其库。容器在主机系统提供的共享操作系统之上运行。
如下图所示:
容器引擎允许您启动容器。它提供构建、运行和部署容器化应用程序所需的工具和服务。
容器有几个好处:
- 可移植性:容器被设计为独立于平台。它们可以在任何支持容器运行时的系统上运行,例如 Docker,而不管底层操作系统是什么。这使得在不同环境之间移动应用程序变得更加容易,包括本地开发机器、测试服务器和不同的云平台。
- 效率:容器共享主机系统的操作系统,这减少了运行多个操作系统的虚拟机的开销。这可以提高资源利用率,并允许在单个主机上运行更高密度的应用程序。
- 一致性:容器将所有必要的组件(包括应用程序代码、运行时、库和依赖项)打包到一个单元中。这消除了“它可以在我的机器上运行”的问题,并确保应用程序在从开发到生产的不同环境中一致运行。
- 隔离:容器为运行应用程序提供了一个轻量级且隔离的环境。每个容器都封装了应用程序及其依赖项,确保它们不会相互干扰。这种隔离有助于防止冲突并确保不同环境中行为的一致性。
快速部署:容器可以快速创建和启动,通常只需几秒钟。这种快速的部署速度对于需要根据需求快速扩展或缩小的应用程序特别有利。
什么是 Docker?
现在我们已经介绍了虚拟机和容器,那么 Docker 到底是什么?Docker 只是一个用于创建和管理容器的工具。
Docker 的核心有两个易于理解的概念:Dockerfile 和 Docker Images。
Dockerfile 包含用于构建 Docker 映像的一组指令。
Docker 镜像充当创建 Docker 容器的模板。它包含运行软件应用程序所需的所有必要代码、运行时、系统工具、库和设置。
因此,Dockerfile 用于构建 Docker 映像,然后将其用作创建一个或多个 Docker 容器的模板。如下图所示。
如果这个解释仍然让您摸不着头脑,请考虑以下使用集装箱的类比。
想象一下,您需要建造多个集装箱来将物品运输到世界各地。您从列出运输集装箱要求的文件开始。这将包含集装箱尺寸、密封件类型、门锁机构、通风和制冷要求(例如,如果您运输需要温度控制环境的食品)等信息。
然后,该需求文件将用于创建容器的详细模板,其中包括显示尺寸和其他规格的工程图。
然后将根据该模板构建物理容器。这一单一模板可用于构建一个或多个物理容器,这些容器都是相同的并符合容器模板中的规格。
如下图所示:
Dockerfile 类似于需求文档,它只是包含一组用于构建容器模板的指令。
Docker 镜像类似于容器模板,它详细介绍了构建物理容器所需的所有指令。
一旦创建,Docker 镜像就是不可变的,这意味着它们无法更改。如果需要对应用程序进行更改,则需要修改 Dockerfile 并创建新镜像。这种不变性确保了应用程序部署的一致性和可重复性。
总的来说,Docker 容器类似于物理运输容器。
总结
容器提供了一种可移植且高效的方式来打包应用程序及其依赖项,从而确保各种环境之间的一致性。它们给软件开发带来的好处类似于不起眼的集装箱给全球经济带来的好处
-
可移植性
通过标准化,运输集装箱可确保世界上任何地方的任何集装箱都可以无缝地用于在各种运输方式之间运输物品——船舶、卡车、火车以及用于将物品装上和卸下不同形式的运输的起重机。 -
提高效率
使用标准集装箱尺寸,您可以移动的货物的包装密度会增加。现在,您可以将更多的东西挤进一个集装箱中,而在集装箱出现之前,您可以将非标准形状和尺寸的货物随意存放在船舱或船坞中。因此,每艘轮船、货运列车或卡车在每次行程中都可以运载更多货物,从而使在世界各地运输货物的成本变得更便宜。