一文理清楚-Docker 容器如何工作

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 容器类似于物理运输容器。

总结

容器提供了一种可移植且高效的方式来打包应用程序及其依赖项,从而确保各种环境之间的一致性。它们给软件开发带来的好处类似于不起眼的集装箱给全球经济带来的好处

  • 可移植性
    通过标准化,运输集装箱可确保世界上任何地方的任何集装箱都可以无缝地用于在各种运输方式之间运输物品——船舶、卡车、火车以及用于将物品装上和卸下不同形式的运输的起重机。

  • 提高效率
    使用标准集装箱尺寸,您可以移动的货物的包装密度会增加。现在,您可以将更多的东西挤进一个集装箱中,而在集装箱出现之前,您可以将非标准形状和尺寸的货物随意存放在船舱或船坞中。因此,每艘轮船、货运列车或卡车在每次行程中都可以运载更多货物,从而使在世界各地运输货物的成本变得更便宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“

帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达,1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…

自定义vue通用左侧菜单组件(未完善版本)

使用到的技术&#xff1a; vue3、pinia、view-ui-plus 实现的功能&#xff1a; 传入一个菜单数组数据&#xff0c;自动生成一个左侧菜单栏。菜单栏可以添加、删除、展开、重命名&#xff0c;拖动插入位置等。 效果预览&#xff1a; 代码&#xff1a; c-menu-wrap.vue <t…

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求&#xff1a; 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc…

鸿蒙OS之Rust开发

背景 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C 代码和提升编译速度&#xff0c;使用了GN Ninja的编译构建系统。GN的构…

Open CASCADE学习|遍历曲面的边

目录 1、球面的Brep数据 2、C遍历球面的边 ​这里以球面为例来说明如何遍历曲面的边。 1、球面的Brep数据 使用Tcl命令在Draw Test Harness中生成的球面并到出Brep数据如下&#xff1a; pload ALL psphere asphere 1 dump asphere 结果如下&#xff1a; *********** D…

构建高效外卖系统:利用Spring Boot框架实现

在当今快节奏的生活中&#xff0c;外卖系统已经成为人们生活中不可或缺的一部分。为了构建一个高效、可靠的外卖系统&#xff0c;我们可以利用Spring Boot框架来实现。本文将介绍如何利用Spring Boot框架构建一个简单但功能完善的外卖系统&#xff0c;并提供相关的技术代码示例…

Qt SQLite3数据库加密 QtCipherSqlitePlugin

在客户端软件开发过程中&#xff0c;基本都会涉及到数据库的开发。QT支持的数据库也有好几种&#xff08;QSQLITE, QODBC, QODBC3, QPSQL, QPSQL7&#xff09;&#xff0c;SQLite就是其中之一&#xff0c;但这个 SQLite 是官方提供的开源版本&#xff0c;没有加密功能的。如果对…

安全小记-sqli-labs闯关

1.安装靶场 介绍&#xff1a; SQLI&#xff0c;sql injection&#xff0c;我们称之为sql注入。何为sql&#xff0c;英文&#xff1a;Structured Query Language&#xff0c;叫做结构化查询语言。常见的结构化数据库有MySQL&#xff0c;MS SQL ,Oracle以及Postgresql。Sql语言…

【Spark系列4】Task的执行

一、Task的执行流程 1.1、Task执行流程 DAGScheduler将Stage生成TaskSet之后&#xff0c;会将Task交给TaskScheduler进行处理&#xff0c;TaskScheduler负责将Task提交到集群中运行&#xff0c;并负责失败重试&#xff0c;为DAGScheduler返回事件信息等&#xff0c;整体如流程…

OpenGL ES 渲染 NV21、NV12 格式图像有哪些“姿势”?

使用2个纹理实现 NV21 格式图像渲染 前文提到渲染 NV21 格式图像需要使用 2 个纹理,分别用于保存 Y plane 和 UV plane 的数据,然后在片段着色器中分别对 2 个纹理进行采样,转换成 RGB 数据。 OpenGLES 渲染 NV21或 NV12 格式图像需要用到 GL_LUMINANCE 和 GL_LUMINANCE_A…

http和https的区别是什么?https有什么优缺点?

HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。这个简单模型是早期Web成功的有功之臣&#xff0c;因为它…

The following untracked working tree files would be overwritten by merge问题的解决

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 在更新git仓库时出现了一个The following untracked working tree files would be overwritten by merge的错误&#xff0c;具体如下图&#xff1a; 分析…

ES 分词器

概述 分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 什么是分词器 顾名思义&#xff0c;文本分析就是把全文本转换成一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。在 ES 中&#xff0c;Ana…

2024年新提出的算法:(凤头豪猪优化器)冠豪猪优化算法Crested Porcupine Optimizer(附Matlab代码)

本次介绍一种新的自然启发式元启发式算法——凤头豪猪优化器(Crested Porcupine Optimizer&#xff0c;CPO)。该成果于2024年1月发表在中科院1区SCI top期刊Knowledge-Based Systems&#xff08;IF 8.8&#xff09;上。 1、简介 受到凤头豪猪&#xff08;CP&#xff09;各种…

iOS 自动打包如何配置配置打包证书和profile provision文件【脚本方式配置】

iOS 最新Jenkins自动化打包总结 本文主要内容&#xff1a; 1.Xcode和Jenkins的相关设置&#xff0c;以及环境切换 2.通过shell脚本将证书和描述文件拷贝到自动化打包的机器&#xff0c;并archive导出ipa包 3.上传到蒲公英 4.解决Swift不支持use_frameworks!的问题 开搞&…

【开源】SpringBoot框架开发天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

[Grafana]ES数据源Alert告警发送

简单的记录一下使用es作为数据源&#xff0c;如何在发送告警是带上相关字段 目录 前言 一、邮件配置 二、配置 1.Query 2.Alerts 总结 前言 ES作为数据源&#xff0c;算是Grafana中比较常见的&#xff0c;Alerts告警是我近期刚接触&#xff0c;有一个需求是当表空间大于…

flutter实现:使用三方组件syncfusion_flutter_datagrid

Syncfusion Flutter DataGrid 是一个用于 Flutter 的数据网格组件&#xff0c;它提供了丰富的功能来显示和编辑数据。这个组件提供了灵活的配置选项&#xff0c;使得开发者能够根据需要定制数据的显示和编辑方式。 项目中有两个需求&#xff0c;一是在列表中要使用可变高度&am…

OpenCV 5 - 图像混合处理addWeighted()

图像混合 1 理论-线性混合操作 其中α的取值范围为0~1之间,表示图像的所占的权重 2 混合处理函数addWeighted() 3 代码示例 Mat src1, src2, dst;src1 imread("./1.png");src2 imread("./2.png");if (!src1.data && src2.empty()) //判断图片是…

云安全中的常见云漏洞和威胁,有哪些防范措施

随着企业在数字化时代的脚步中愈发倚重云托管服务&#xff0c;云安全问题成为不容忽视的焦点。云服务的便捷性为企业提供了强大的存储和计算能力&#xff0c;然而&#xff0c;与之伴随而来的攻击风险也日益显著。最新的研究数据揭示&#xff0c;云安全漏洞可能导致的数据泄露&a…