我几天前听说过Docker,并且想了解一下。
但是实际上,我不知道这个“容器”的目的是什么?
什么是容器?
它可以代替专门用于开发的虚拟机吗?
简而言之,在公司中使用Docker的目的是什么?主要优势?
我几天前听说过Docker,并且想了解一下。
但是实际上,我不知道这个“容器”的目的是什么?
什么是容器?
它可以代替专门用于开发的虚拟机吗?
简而言之,在公司中使用Docker的目的是什么?主要优势?
Answers:
VM:例如,可以使用VM软件在Windows内安装Ubuntu。它们都将同时运行。这就像在操作系统中构建一台具有其核心组件(如CPU,RAM,磁盘,网卡等)的PC,然后将它们组装起来就像是一台真正的PC。这样,虚拟PC便成为具有其操作系统(称为主机)的实际PC内部的“来宾”。
容器:与上面的容器相同,但是它没有使用整个操作系统,而是削减了虚拟OS的“不必要”组件,以创建其最小版本。这导致了LXC(Linux容器)的创建,它比VM Machines更快。
Docker:与虚拟机和容器不同,Docker容器不需要或包含单独的操作系统。相反,它依赖于Linux内核的功能并使用资源隔离。
Docker的目的:其主要重点是在Linux上自动化应用程序在软件容器中的部署以及自动化操作系统级别的虚拟化。它比标准容器轻巧,可在几秒钟内启动。
(请注意,对于Docker,不需要来宾操作系统)
[注意,此答案主要针对Linux容器,可能并不完全适用于其他操作系统。]
什么是容器?
它是一个应用程序:容器是运行彼此隔离的应用程序的一种方式。容器不是虚拟化硬件来运行多个操作系统,而是依靠虚拟化操作系统来运行多个应用程序。这意味着与VM相比,您可以在同一硬件上运行更多容器,因为您只有一个OS副本在运行,并且无需为每个应用实例预分配内存和CPU核心。与其他任何应用程序一样,当容器需要CPU或内存时,它会分配它们,然后在完成后释放它们,从而允许其他应用程序稍后使用这些相同的有限资源。
它们利用内核名称空间:默认情况下,每个容器都将获得一个环境,其中以下内容被命名为:
/
容器中/
的主机与主机上的不同。这些命名空间中的每一个还可以防止容器看到主机上或其他容器中的文件系统或进程之类的东西,除非您明确删除该隔离。
和其他Linux安全工具:容器还利用SELinux,AppArmor,Capabilities和Seccomp等其他安全功能来限制容器内的用户(包括root用户)逃脱容器或对主机造成负面影响。
将应用程序及其依赖项打包以实现可移植性:将应用程序打包到容器中不仅需要将应用程序本身组装,还需要将运行该应用程序所需的所有依赖项组装到一个可移植映像中。该映像是用于创建容器的基本文件系统。因为我们只是隔离应用程序,所以此文件系统不包括虚拟化整个操作系统所需的内核和其他OS实用程序。因此,容器的映像应该比等效虚拟机的映像小得多,从而可以更快地将其部署到网络上的节点。结果,容器已成为将应用程序部署到云和远程数据中心的流行选择。
它可以代替专门用于开发的虚拟机吗?
这取决于:如果您的开发环境正在运行Linux,并且您不需要访问硬件设备,或者可以直接访问物理硬件是可以接受的,那么您会发现向Linux容器的迁移相当简单。泊坞窗容器的理想目标是可通过网络访问的基于Web的API之类的应用程序(例如REST应用程序)。
简而言之,在公司中使用Docker的目的是什么?主要优势?
开发或运营:Docker通常以两种途径之一进入环境。与虚拟机相比,开发人员寻求一种更快地开发和本地测试其应用程序的方法,而运营则希望在更少的硬件上运行更多的工作负载。
或Devops:理想的目标之一是立即从CI / CD部署工具中利用Docker,编译应用程序并立即构建部署到开发,CI,产品等的映像。容器通常会减少移动应用程序的时间从代码检入到可供测试,使开发人员更加高效。而且,如果设计合理,则可以在生产中部署经过开发人员和CI工具测试和批准的同一映像。由于该映像包括所有应用程序依赖项,因此可以大大降低开发中可能发生的生产中断的风险。
可伸缩性:我将提到的容器的最后一个主要优点是,它们是为实现水平可伸缩性而设计的。当您在无负载的情况下使用无状态应用程序时,由于容器较小的图像大小和减少的开销,因此容器的扩展更加轻松快捷。因此,您会看到许多大型网络公司(例如Google和Netflix)都在使用容器。
几天前,同样的问题也引起了我的注意,进入该系统后我发现了什么,让我们用非常简单的语言来理解。
在当前的应用程序体系结构和开发流程一切正常的情况下,为什么要考虑docker和容器!
让我们举一个例子,我们正在使用nodeJs,MongoDB,Redis,RabbitMQ等服务[您可以想到任何其他服务]开发应用程序。
现在,如果我们忘记了Docker或其他容器化应用程序的存在,我们将在应用程序开发和运输过程中遇到以下问题。
服务(nodeJs,mongoDB,Redis,RabbitMQ等)与OS的兼容性(即使在找到与OS兼容的版本之后,如果与版本相关的意外事件发生,那么我们需要再次重新考虑兼容性并进行修复)。
如果两个系统组件在OS中的应用程序中需要具有不同版本的库/依赖关系(由于库和依赖关系版本问题而导致应用程序出现异常行为,则每次都需要重新查看)。
最重要的是,如果新人加入团队,我们会发现很难建立新的环境,这个人必须遵循大量的指令并运行数百条命令才能最终建立环境,这需要时间和精力。
人们必须确保他们使用的是正确版本的OS,并检查服务与OS的兼容性,并且每个开发人员每次安装时都必须遵循此步骤。
我们也有不同的环境,例如开发,测试和生产。如果一个开发人员愿意使用一个操作系统,而另一个开发人员可以使用其他操作系统,则在这种情况下,我们不能保证我们的应用程序在这两种不同情况下的行为相同。
所有这些使我们在开发,测试和交付应用程序的过程中变得很困难。
因此,我们需要一些能够解决兼容性问题的东西,并允许我们在不影响其他组件的情况下对任何系统组件进行更改和修改。
现在我们来考虑docker,因为它的目的是将应用程序容器化并自动化应用程序的部署,并非常容易地将它们交付。
码头工人如何解决上述问题-
我们可以在不同的容器中运行每个服务组件(nodeJs,MongoDB,Redis,RabbitMQ),它们具有自己的依存关系和库,它们在同一操作系统中但具有不同的环境。
我们只需要运行一次docker配置,然后我们所有的团队开发人员就可以使用简单的docker run命令入门,我们在这里节省了大量时间和精力:)。
因此,容器是隔离的环境,所有依赖项和库都与它们自己的进程,网络接口和挂接捆绑在一起。
所有容器都使用相同的OS资源,因此它们花费较少的时间来启动,并以较少的硬件成本有效地利用了CPU。
我希望这会有所帮助。
让我尝试提供尽可能简单的答案:
但是实际上,我不知道这个“容器”的目的是什么?
什么是容器?
简而言之:包含软件的软件包。更具体地说,应用程序及其所有依赖项捆绑在一起。常规的,非dockerized的应用程序环境直接挂接到OS,而Docker容器是OS的抽象层。
容器与图像的不同之处在于,容器是图像的运行时实例 -类似于在您熟悉OOP的情况下对象是类的运行时实例。
它可以代替专门用于开发的虚拟机吗?
VM和Docker容器都是虚拟化技术,因为它们在系统基础架构之上提供了抽象。
VM运行完整的“ guest”操作系统,并通过虚拟机管理程序虚拟访问主机资源。这意味着VM通常为环境提供的资源比其实际需要的资源多。通常,VM为环境提供的资源比大多数应用程序所需的资源更多。因此,容器是一种较轻的技术。两者解决了不同的问题。
简而言之,在公司中使用Docker的目的是什么?主要优势?
容器化与微服务齐头并进。组成大型应用程序的小型服务通常会在Docker容器中进行测试和运行。这使连续测试更加容易。
另外,由于Docker容器是只读容器,因此它们实施了关键的DevOps原则:生产服务应保持不变
使用它们的一些一般好处: