当前位置: 首页 > 知识库问答 >
问题:

Docker,这是什么,目的是什么

易宣
2023-03-14

我几天前听说了Docker的事,想过去看看。

但事实上,我不知道这个“容器”的用途是什么?

什么是容器?

它能取代一个专门用于开发的虚拟机吗?

简单地说,在公司中使用Docker的目的是什么?主要的优势?

共有3个答案

金晨
2023-03-14

几天前,同样的问题也在我的脑海中浮现,我在进入这个问题后发现了什么,让我们用简单的语言来理解。

当当前的应用程序架构和开发过程看起来一切都很好的时候,为什么要考虑docker和容器呢!!

让我们举一个例子,我们正在使用nodeJs、MongoDB、Redis、RabbitMQ等服务开发一个应用程序[您可以想到任何其他服务]。

现在,如果我们忘记docker或其他容器化应用程序的替代方案的存在,我们就会在应用程序开发和运输过程中面临以下问题。

>

  • 服务(nodeJs、mongoDB、Redis、RabbitMQ等)与操作系统的兼容性(即使在找到与操作系统兼容的版本之后,如果与版本相关的意外情况发生,那么我们需要重新检查兼容性并修复它)。

    如果两个系统组件在操作系统中的应用程序中需要一个不同版本的库/依赖项(需要每次重新查看,以防由于库和依赖项版本问题导致应用程序出现意外行为)。

    最重要的是,如果有新人加入团队,我们会发现很难建立新的环境,人必须遵循大量的指令,运行数百条命令才能最终建立环境,耗时费力。

    人们必须确保他们使用的是正确的操作系统版本,并检查服务与操作系统的兼容性,每个开发人员在每次进行设置时都必须遵循这一点。

    我们也有不同的环境,比如dev、test和Production,如果一个开发人员可以使用一个操作系统,而另一个开发人员可以使用其他操作系统,在这种情况下,我们不能保证我们的应用程序在这两种不同的情况下会以相同的方式运行。

    所有这些都给我们在开发、测试和发布应用程序的过程中带来了困难。

    所以我们需要一种能够处理兼容性问题的东西,允许我们在不影响其他组件的情况下对任何系统组件进行更改和修改。

    现在我们考虑docker,因为它的目的是容器化应用程序,自动化应用程序的部署,并非常容易地运输它们。

    docker如何解决上述问题-

    >

  • 我们可以在不同的容器中运行每个服务组件(nodeJs、MongoDB、Redis、RabbitMQ),这些容器具有自己的依赖项和库,并在相同的OS中运行,但环境不同。

    我们只需运行一次docker配置,然后我们的团队开发人员就可以开始使用简单的docker运行命令,我们在这里节省了大量的时间和精力:)。

    因此容器是孤立的环境,所有依赖项和库都捆绑在一起,并带有它们自己的进程、网络接口和挂载。

    所有容器都使用相同的操作系统资源,因此它们需要更少的时间来启动并以更少的硬件成本有效地利用CPU。

    我希望这会有所帮助。

  • 赵雅懿
    2023-03-14

    [注意,这个答案关注的是Linux容器,可能并不完全适用于其他操作系统。]

    什么是容器?

    它是一个应用程序:容器是运行彼此隔离的应用程序的一种方式。容器不是通过虚拟化硬件来运行多个操作系统,而是通过虚拟化操作系统来运行多个应用程序。这意味着您可以在同一硬件上运行比VM更多的容器,因为您只有一个OS副本在运行,并且您不需要为应用程序的每个html" target="_blank">实例预分配内存和CPU内核。就像任何其他应用程序一样,当容器需要CPU或内存时,它会分配它们,然后在完成时释放它们,允许其他应用程序以后使用这些同样有限的资源。

    它们利用内核名称空间:默认情况下,每个容器将接收一个环境,其中有以下名称空间:

    • 挂载:容器中的文件系统、/将与主机上的/不同。
    • pid:进程ID的,容器中的pid 1是您启动的应用程序,从主机查看时,此pid将有所不同。
    • 网络:容器在默认情况下使用自己的环回接口(127.0.0.1)和专用IP运行。Docker使用Linux桥接网络等技术将多个容器连接在它们自己的专用LAN中。
    • IPC:进程间通信
    • UTS:包括主机名
    • 用户:您可以选择移动所有用户ID,使其与主机的ID相对应

    这些名称空间中的每一个都防止容器看到诸如主机上或其他容器中的文件系统或进程之类的东西,除非您显式地删除这种隔离。

    和其他linux安全工具:容器还利用其他安全特性,如SELinux、AppArmor、Capabilities和Seccomp来限制容器中的用户(包括根用户)逃离容器或对主机造成负面影响。

    将应用程序与它们的依赖项打包以实现可移植性:将应用程序打包到容器中不仅需要将应用程序本身组装起来,还需要将运行该应用程序所需的所有依赖项组装到一个可移植映像中。此映像是用于创建容器的基文件系统。因为我们只是隔离应用程序,所以这个文件系统不包括虚拟化整个操作系统所需的内核和其他OS实用程序。因此,容器的映像应明显小于等效虚拟机的映像,从而使其更快地部署到网络上的节点。因此,容器成为将应用程序部署到云和远程数据中心的流行选项。

    它能取代一个专门用于开发的虚拟机吗?

    这取决于:如果您的开发环境运行的是Linux,并且您不需要访问硬件设备,或者可以直接访问物理硬件,那么您会发现到Linux容器的迁移相当简单。docker容器的理想目标是应用程序,如基于web的API(例如REST应用程序),您可以通过网络访问这些应用程序。

    简单地说,在公司中使用Docker的目的是什么?主要的优势?

    Dev或Ops:Docker通常以两种路径之一进入环境。开发人员正在寻找一种更快速地开发和本地测试他们的应用程序的方法,操作人员正在寻找一种比虚拟机更少的硬件上运行更多的工作负载。

    或DevOps:理想的目标之一是立即从CI/CD部署工具中利用Docker,编译应用程序并立即构建一个部署到开发、CI、prod等的映像。容器通常减少了将应用程序从代码签入转移到可用于测试的时间,使开发人员更有效率。并且如果设计得当,经过开发人员和配置项工具测试和批准的相同映像就可以在生产中部署。由于该映像包含了所有的应用程序依赖关系,因此在开发中工作的产品中断的风险大大降低了。

    可伸缩性:我将提到的容器的最后一个关键好处是,它们是为水平可伸缩性而设计的。当你有处于重载下的无状态应用程序时,容器由于其较小的图像大小和减少的开销而更容易和更快地向外扩展。由于这个原因,你可以看到许多大型的网络公司都在使用容器,比如Google和Netflix。

    吉玉宸
    2023-03-14

    VM:使用VM软件,例如,Ubuntu可以安装在Windows内部。它们会同时运行。这就像是在一个操作系统中构建一台PC机,它的核心部件包括CPU、RAM、磁盘、网卡等,并将它们组装起来,就像它是一台真正的PC机一样工作。这样,虚拟PC就成了实际PC内部的“客人”,而实际PC的操作系统被称为主机。

    容器:与上面相同,但它不是使用整个操作系统,而是减少了虚拟操作系统的“不必要”组件,以创建一个最小版本。这导致了LXC(Linux容器)的创建,它比虚拟机更快。

    (请注意,Docker不需要Guest OS)

     类似资料:
    • 我正在尝试创建我的第一个Spring Boot应用程序。我在这里使用的是: 然而,eclipse抱怨说: 没有为此构建指定目标。您必须以

    • 关于「什么是 Docker」这个话题,互联网上有大量精彩的文章,我们首推微博用户「Gary的影响力」最近发表在「运维帮」上的这一篇「为什么容器技术将主宰世界」。Gary 从集装箱行业的兴盛入手,以史为鉴,言简意赅的介绍了 Docker 技术对软件开发的重要性。我们获得了作者的授权,全文转载如下。 为什么容器技术将主宰世界 2015-11-14 作者:Gary 原文链接 由于本文篇幅较长,为了帮助你

    • Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。 Docker 自开源后受到广泛

    • 问题内容: 当我调用toString从函数调用中收到的对象时,会得到此信息。我知道对象的类型编码在此字符串中,但是我不知道如何读取它。 这种编码称为什么类型? 问题答案: ;是的名称代表的数组的类。 命名方案记录在: 如果该类对象表示的引用类型不是数组类型,则返回该类的二进制名称,如Java语言规范(§13.1)所指定。 如果此类对象表示原始类型或void,则返回的名称是与原始类型或对应的Java

    • 问题内容: 我是Go的新手,在浏览其他一些线程时遇到了以下代码行: 含义是什么?它是否指定将在if条件中分配某些内容(因为err似乎正在发生这种情况)?我在Wiki上找不到这种语法的示例,并且我很好奇它的用途。 问题答案: 因为返回两个值,所以如果需要它们中的任何一个,都必须在某个地方接收这些值。该是一个占位符,基本的意思是“我不关心这个特殊的返回值。” 在这里,我们只关心检查错误,而无需对实际的

    • 因此,我想要一个代码,使我的HTML列表在冒号之前加粗。所以我搜索了一个我选择使用的代码。在堆栈溢出中看到一个代码:https://stackoverflow.com/a/46855744/15163136.我没有使用for循环,而是使用foreach循环。 但唯一的问题是我不理解和