Docker,它是什么,目的是什么


111

我几天前听说过Docker,并且想了解一下。

但是实际上,我不知道这个“容器”的目的是什么?

什么是容器?

它可以代替专门用于开发的虚拟机吗?

简而言之,在公司中使用Docker的目的是什么?主要优势?



Answers:


115

VM:例如,可以使用VM软件在Windows内安装Ubuntu。它们都将同时运行。这就像在操作系统中构建一台具有其核心组件(如CPU,RAM,磁盘,网卡等)的PC,然后将它们组装起来就像是一台真正的PC。这样,虚拟PC便成为具有其操作系统(称为主机)的实际PC内部的“来宾”。

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

Docker:与虚拟机和容器不同,Docker容器不需要或包含单独的操作系统。相反,它依赖于Linux内核的功能并使用资源隔离。
Docker的目的:其主要重点是在Linux上自动化应用程序在软件容器中的部署以及自动化操作系统级别的虚拟化。它比标准容器轻巧,可在几秒钟内启动。 gg

(请注意,对于Docker,不需要来宾操作系统)


1
我尝试寻找有关docker开发部署工作流程的资源,但似乎找不到任何东西。例如,让我有一个使用laravel + angular4的Lampp环境。我是否要与队友共享某个文件?如果将应用程序源(php html js / ts)放在容器中,该如何编辑?我们还可以在源代码上使用git / svn吗?
anaval

13
VM代表“虚拟机”。无需将其称为“ VM Machine”,因为它随后变为“ Virtual Machine machine”。:)
Dzhuneyt

32

[注意,此答案主要针对Linux容器,可能并不完全适用于其他操作系统。]

什么是容器?

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

它们利用内核名称空间:默认情况下,每个容器都将获得一个环境,其中以下内容被命名为:

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

这些命名空间中的每一个还可以防止容器看到主机上或其他容器中的文件系统或进程之类的东西,除非您明确删除该隔离。

和其他Linux安全工具:容器还利用SELinux,AppArmor,Capabilities和Seccomp等其他安全功能来限制容器内的用户(包括root用户)逃脱容器或对主机造成负面影响。

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

它可以代替专门用于开发的虚拟机吗?

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

简而言之,在公司中使用Docker的目的是什么?主要优势?

开发或运营:Docker通常以两种途径之一进入环境。与虚拟机相比,开发人员寻求一种更快地开发和本地测试其应用程序的方法,而运营则希望在更少的硬件上运行更多的工作负载。

或Devops:理想的目标之一是立即从CI / CD部署工具中利用Docker,编译应用程序并立即构建部署到开发,CI,产品等的映像。容器通常会减少移动应用程序的时间从代码检入到可供测试,使开发人员更加高效。而且,如果设计合理,则可以在生产中部署经过开发人员和CI工具测试和批准的同一映像。由于该映像包括所有应用程序依赖项,因此可以大大降低开发中可能发生的生产中断的风险。

可伸缩性:我将提到的容器的最后一个主要优点是,它们是为实现水平可伸缩性而设计的。当您在无负载的情况下使用无状态应用程序时,由于容器较小的图像大小和减少的开销,因此容器的扩展更加轻松快捷。因此,您会看到许多大型网络公司(例如Google和Netflix)都在使用容器。


2
+1我完全同意您的回答,尤其是“它可以代替虚拟机”部分。我在其他地方看到很多评论,强调Docker不是虚拟机,但是从经验来看,在许多用例中,它同样有效,甚至是更好的选择。但是,当您说“可以直接访问物理硬件”时,您是什么意思?
泰勒斯

2
@tyress(如果您的主机是Linux),则可以将设备直接安装到Linux容器中。我已经看到它是通过声音设备完成的,但是/ dev中的任何内容都可以添加。这绕过了一些容器隔离,但是对于诸如台式机应用程序之类的特定任务有意义。
BMitch

这是惊人的。我没有想到这一点。
泰勒斯

@BMitch:非常干净优雅的答案,谢谢!我想我现在可以可视化什么是容器了。但是,如果您可以更新容器与 docker的关系,这将是很棒的选择 比较容器和VM,docker是否等效于hypervisor?
rahulaga_dev

1
Docker是一种工具,不仅可以实现容器,还可以提供其余所需的生态系统,例如Docker Hub上的注册表以及将VM嵌入以运行Linux容器的桌面环境。
BMitch

6

几天前,同样的问题也引起了我的注意,进入该系统后我发现了什么,让我们用非常简单的语言来理解。

在当前的应用程序体系结构和开发流程一切正常的情况下,为什么要考虑docker和容器!

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

现在,如果我们忘记了Docker或其他容器化应用程序的存在,我们将在应用程序开发和运输过程中遇到以下问题。

  1. 服务(nodeJs,mongoDB,Redis,RabbitMQ等)与OS的兼容性(即使在找到与OS兼容的版本之后,如果与版本相关的意外事件发生,那么我们需要再次重新考虑兼容性并进行修复)。

  2. 如果两个系统组件在OS中的应用程序中需要具有不同版本库/依赖关系(由于库和依赖关系版本问题而导致应用程序出现异常行为,则每次都需要重新查看)。

  3. 最重要的是,如果新人加入团队,我们会发现很难建立新的环境,这个人必须遵循大量的指令并运行数百条命令才能最终建立环境,这需要时间和精力。

    人们必须确保他们使用的是正确版本的OS,并检查服务与OS的兼容性,并且每个开发人员每次安装时都必须遵循此步骤。

  4. 我们也有不同的环境,例如开发,测试和生产。如果一个开发人员愿意使用一个操作系统,而另一个开发人员可以使用其他操作系统,则在这种情况下,我们不能保证我们的应用程序在这两种不同情况下的行为相同。

所有这些使我们在开发测试交付应用程序的过程中变得很困难。

因此,我们需要一些能够解决兼容性问题的东西,并允许我们在不影响其他组件的情况下对任何系统组件进行更改和修改。

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

在此处输入图片说明

码头工人如何解决上述问题-

  1. 我们可以在不同的容器中运行每个服务组件(nodeJs,MongoDB,Redis,RabbitMQ),它们具有自己的依存关系,它们在同一操作系统中但具有不同的环境。

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

因此,容器是隔离的环境,所有依赖项和库都与它们自己的进程网络接口挂接捆绑在一起。

所有容器都使用相同的OS资源,因此它们花费较少的时间来启动,并以较少的硬件成本有效地利用了CPU。

我希望这会有所帮助。


2

让我尝试提供尽可能简单的答案:

但是实际上,我不知道这个“容器”的目的是什么?

什么是容器?

简而言之:包含软件软件包。更具体地说,应用程序及其所有依赖项捆绑在一起。常规的,非dockerized的应用程序环境直接挂接到OS,而Docker容器是OS的抽象层。

容器与图像的不同之处在于,容器是图像的运行时实例 -类似于在您熟悉OOP的情况下对象是类的运行时实例。

它可以代替专门用于开发的虚拟机吗?

VM和Docker容器都是虚拟化技术,因为它们在系统基础架构之上提供了抽象。

VM运行完整的“ guest”操作系统,并通过虚拟机管理程序虚拟访问主机资源。这意味着VM通常为环境提供的资源比其实际需要的资源多。通常,VM为环境提供的资源比大多数应用程序所需的资源更多。因此,容器是一种较轻的技术。两者解决了不同的问题。

简而言之,在公司中使用Docker的目的是什么?主要优势?

容器化与微服务齐头并进。组成大型应用程序的小型服务通常会在Docker容器中进行测试和运行。这使连续测试更加容易。

另外,由于Docker容器是只读容器,因此它们实施了关键的DevOps原则:生产服务应保持不变

使用它们的一些一般好处:

  • 高度隔离服务
  • 容器包含应用程序所需的所有内容,因此具有出色的可管理性
  • 实施技术的封装(在容器中)
  • 与虚拟机相比,资源利用率高(由于轻量级的OS虚拟化)
  • 快速部署
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.