Docker 容器引擎是操作系统和应用程序之间的一个完整层,还是仅仅是运行在操作系统上其他应用程序旁边的另一个应用程序?

Docker 容器引擎是操作系统和应用程序之间的一个完整层,还是仅仅是运行在操作系统上其他应用程序旁边的另一个应用程序?,docker,kubernetes,containers,virtualization,hypervisor,Docker,Kubernetes,Containers,Virtualization,Hypervisor,在大多数教程、出版物甚至Docker的一些博客文章中,容器引擎被描述为位于操作系统顶部的整个层。它也被认为是一个管理程序或一个执行虚拟化的层,有时甚至被称为轻量级虚拟化或操作系统级虚拟化 但事实是,这些应用程序直接运行在操作系统上,它们都共享同一个内核。容器引擎不会解释或翻译任何要在底层操作系统上运行的代码 我也读过,但主要是关于虚拟机和容器之间的区别,但我的问题是关于容器引擎的 将容器引擎描述为操作系统和应用程序之间的整个层(图1)是正确的,还是应该将其视为在操作系统之上的其他应用程序旁边运行

在大多数教程、出版物甚至Docker的一些博客文章中,容器引擎被描述为位于操作系统顶部的整个层。它也被认为是一个管理程序或一个执行虚拟化的层,有时甚至被称为轻量级虚拟化或操作系统级虚拟化

但事实是,这些应用程序直接运行在操作系统上,它们都共享同一个内核。容器引擎不会解释或翻译任何要在底层操作系统上运行的代码

我也读过,但主要是关于虚拟机和容器之间的区别,但我的问题是关于容器引擎的

将容器引擎描述为操作系统和应用程序之间的整个层(图1)是正确的,还是应该将其视为在操作系统之上的其他应用程序旁边运行的进程(图2)


这取决于你想如何看待它

在Docker中,容器基本上是Docker进程的子进程, 并另外设置为受misc约束。内核特性 例如名称空间或cgroup

因此,虽然容器进程可能认为它们运行在内核之上, 这是一个由Docker设置并由内核特性创建的幻觉

人们是否认为幻觉是一个独立的“容器引擎”层是个人问题。 (IMHO基本上是“vim vs Emacs”类型的问题。)

容器引擎是操作系统和应用程序之间的整个层吗

没有

容器引擎是运行在操作系统上其他应用程序旁边的另一个应用程序吗

这个定义更好

在他的一个演示文稿中有以下幻灯片:


下面是一段历史,这可能会对以下术语有所帮助:
docker daemon
containerd
runc
rkt

发件人::

在Docker版本1.11之前,Docker引擎守护程序下载容器映像,启动容器进程,公开远程API,并充当日志收集守护程序,所有这些都在一个集中式进程中以root运行

虽然这种集中式体系结构便于部署,但它没有遵循Unix进程和权限分离的最佳实践;此外,这使得Docker很难与upstart和systemd等Linux init系统正确集成

自1.11版以来,Docker守护进程不再处理容器本身的执行。相反,这项工作现在由管理层处理。更准确地说,Docker守护进程将映像准备为(OCI)包,并对containerd进行API调用以启动OCI包。containerd然后使用

进一步阅读:


回答您的问题时,容器图像在运行时成为容器,如果是Docker容器,则图像在Docker引擎上运行时成为容器。但正如大多数容器体系结构的图片所示,docker引擎部署在主机操作系统和内容化应用程序之间的整个层上,因为内容化体系结构的目标是只在上面构建内容化应用程序

所以,如果您不想只在操作系统上部署内容化应用程序,您不必使用Docker Engine,这意味着Docker Engine不必在整个Docker体系结构级别上使用和部署。如果您想在docker enginer上分配整个层,并假设您的环境中的每个应用程序都将被上下文化,那么在创建这样的体系结构时,这取决于您自己

我们可以将Docker Engine定义为运行时(是一个客户机-服务器应用程序)和工具,该工具使由Docker文件定义的容器应用程序能够在主机操作系统的独立“容器”部分上运行


我希望这会有所帮助。

容器(名称空间)是操作系统级别的功能,因此(1)可能比(2)更准确。@DavidMaze的可能重复您提到的链接是关于容器与虚拟机的,但这个问题是关于容器引擎体系结构的。@halfer但容器引擎没有虚拟化,翻译和应用程序直接在操作系统上运行,共享同一个内核。没错,但整个操作系统中仍然有一些东西支持集装箱化。在Linux中,这是一个很好的例子。我同意这不是“引擎”——在Docker中,引擎只是侦听控制台命令的服务器端。