docker容器不需要操作系统,但每个容器都有一个,为什么?

kr98yfug  于 2023-04-29  发布在  Docker
关注(0)|答案(4)|浏览(483)

“docker”是一个时髦的词,这些天,我试图弄清楚,它是什么,它是如何工作的。更具体地说,它与普通VM有何不同(例如:例如,VirtualBox、HyperV或WMWare解决方案)。
文档的介绍部分(https://docs.docker.com/get-started/#a-brief-explanation-of-containers)读到:
容器在主机的内核上本地运行应用程序。与只能通过虚拟机管理程序虚拟访问主机资源的虚拟机相比,它们具有更好的性能特征。容器可以获得本机访问,每个容器都在一个独立的进程中运行,不会比任何其他可执行文件占用更多的内存。
答对了!这就是区别。容器直接运行在托管操作系统的内核上,这就是为什么它们如此轻量级和快速(另外,它们提供了进程隔离和良好的分布式机制,以Docker Hub的形式,这很好地发挥了将容器彼此连接的能力)。
但是等一下。我可以使用docker在windows上运行Linux应用程序-这是怎么回事?当然,有一些VM。否则我们就无法完成工作。..
好的,但是当我们在Linux主机上工作时,它看起来是什么样子的呢???现在是真实的的困惑。..仍然将OS定义为我们想要创建的每个映像的基础映像。即使我们说“从零开始”--零开始仍然是一些极简主义的内核。所以来了

问题1:如果我运行e。g. CentOS主机,我可以创建容器,它将直接使用该主机操作系统的内核(而不是VM,它包括自己的操作系统)?如果是的话,我该如何做呢?如果不是,为什么docker的文档对我们撒谎(因为docker镜像总是在一些虚拟机中运行,它与其他虚拟机没有太大的不同,或者是吗?))?

经过一番思考和环顾四周,我想知道,如果一些优化是为运行图像。来了

问题2:如果我运行两个容器,这两个容器的映像都基于同一个父映像,那么这个父映像是否只被加载到内存中一次?每个容器都有一个虚拟机,还是只有一个虚拟机运行两个容器?如果我们使用不同的操作系统呢?

第三个问题颇受打击:

问题3:有没有一些资源,描述这种事情。..因为大多数讨论docker的文章只是告诉“它太酷了,你一定要用ut。只要运行一个命令,就很高兴”。...这并不能解释太多。

谢谢。

0qx6xfy6

0qx6xfy61#

Docker“容器”不是虚拟机;它们只是在主机系统上运行的常规进程(因此总是在主机的Linux内核上运行),具有一些特殊的配置以将它们与系统的其余部分分开。
您可以通过在容器中启动一个进程并在容器外执行ps来自己看到这一点;您将在主机的所有进程列表中看到该进程。但是,在容器化进程中运行ps将只显示该容器中的进程;限制系统上进程的视图是容器化所提供的便利之一.
容器通常还被给予许多其他系统资源的有限或单独的视图,例如文件、网络接口和用户。特别是,容器化进程通常被赋予一个完全不同的根文件系统和一组用户,使其看起来几乎就像在一台单独的机器上运行一样。(但事实并非如此;它仍然共享主机的CPU、内存、I/O带宽,最重要的是,共享主机的Linux内核。)
回答您的具体问题:
1.在CentOS(或任何其他系统)上,您创建的 * 所有 * 容器都使用主机的内核。没有办法创建使用不同内核的容器;你需要为此启动一个虚拟机。
1.图像只是磁盘上的文件;这些文件以与任何文件相同的方式“加载到存储器中”。因此,对于共享父映像中文件的任何特定磁盘块,内存中永远不会有该磁盘块的多个副本。然而,每个容器在用于处理写入的基本映像层之上都有自己的私有“透明”文件系统层,因此如果您更改了一个文件,更改的块将存储在那里,并且现在将与其他进程(未更改该文件中的任何块)看到的底层映像分离。
1.在Linux中,您可以尝试man cgroupsman cgroup_namespaces来获得有关cgroup机制的一些相当技术性的细节,这是Docker(以及Linux上的任何其他容器化方案)用来限制和更改容器化进程所看到的内容。我没有任何其他与此直接相关的阅读建议,但我认为学习进程和其他各种系统如何在Unix和POSIX系统上工作的技术细节可能会有所帮助,因为理解这些可以让你了解容器化做了什么。也许可以从学习chroot(2)系统调用开始,并使用它进行一些编程(或者甚至使用chroot(8)程序);这将给予你一个实际的例子,说明一个特定的集装箱化领域。
后续问题:
1.没有内核版本匹配;只使用一个主机内核。如果容器中的程序在该版本的内核上不能工作,那么您就不走运了。例如,尝试在Linux系统上运行Docker官方centos:6centos:5容器。19或更高版本的内核,当你尝试启动它时,你会看到/bin/bash segfaults。内核和用户界面程序不兼容。如果程序试图使用内核中没有的较新的工具,它也会同样失败。这与运行相同的二进制文件(程序 * 和共享库 *!)在容器外。

  1. Windows和Macintosh系统不能直接运行Linux容器,因为它们不是具有运行Linux程序的适当设施的Linux内核,更不用说支持相同的额外cgroup设施了。因此,当你在这些容器上安装Docker时,通常会安装一个Linux VM来运行容器。它几乎总是只安装一个VM,并在该VM中运行所有容器;否则,将是浪费资源,毫无益处。(实际上,如上所述,能够有几个不同的内核版本可能会有好处。)
50few1ms

50few1ms2#

Docker在其容器中没有操作系统。简单来说,一个docker容器镜像只是一种容器镜像所依赖的linux-image的文件系统快照。
容器镜像包含一些基本程序,如bash-shell,vim-editor等,以方便开发人员轻松使用docker镜像。此外,docker镜像可以包含预安装的依赖项,如nodeJS,redis-server等,我们可以在docker hub上找到。
Docker在幕后使用host OS,也就是linux本身来运行它的容器。我们以docker容器的形式看到的类linux文件系统快照中包含的程序实际上在主机操作系统上独立运行
容器镜像听起来像是不同的linux发行版,但它们是这些发行版的文件系统快照。所有Linux发行版都基于同一个内核。它们在附带的程序、工具和依赖项方面有所不同。
也请注意此注解click(https://stackoverflow.com/a/57720243/11723512)。这与这个问题非常相关。
希望这能帮上忙。

5jdjgkvh

5jdjgkvh3#

自从我发布这个问题已经很久了,但看起来,它仍然得到点击。..所以我决定回答它--其实主要是问题,这是在标题中(文中的问题由Curt J仔细回答Sampson)。
所以,关于“主要”问题的讨论:如果容器不是虚拟机,那么我们为什么需要虚拟机呢?
正如你可能猜到的,我正在Windows上工作(在Linux上这个问题不会出现,因为在Linux上,Docker不需要VM)。
原因,为什么我们需要一个VM的容器在Winodows是很明显的(可能这就是原因,为什么没有人明确提到它).正如这里和许多其他常见问题所提到的,容器重用内核和托管操作系统的一些其他资源。考虑到大多数可用的容器都是基于Linux的,人们可以得出结论,这些容器需要主机操作系统来提供Linux内核供其运行。这在Windows上并不容易(我不确定,也许现在Linux子系统可以实现)。这就是为什么在Windows上我们需要一个VM,它在这个VM中运行Linux和docker服务。然后,当我们启动容器时,它们也在这个VM中启动(并重用其Linux OS的资源)。所有容器都在同一个VM中运行。更技术化一点:默认情况下,docker使用Hyper-V来运行这个linux虚拟机,但也可以使用Docker-Toolbox,它使用Oracle VirtualBox。顺便说一下,VM可以在Virtual Box界面中自由查看。好的部分是Docker(或Docker工具箱)负责管理这个VM,我们不需要关心它。
现在是一些额外的问题,这一次让我更加困惑。有人可能会想:“好了,现在清楚了。如果我们在Winodws操作系统上运行Linux容器,那么我们需要Linux内核,因此需要Linux中的VM。但是如果我们在Windows上运行Windows容器(顺便说一下,它是存在的),那么就不需要VM了,对吗?……”回答:“错误”(或几乎错误)。:)问题是,基于Windows的容器(至少那些,我看到的)使用Windows服务器内核,这是不可用的e.在Windows 10中。因此,仍然需要运行特殊版本的Windows Server的VM。事实上,微软甚至创建了Windows Server的特殊版本,它可以在VM上免费运行,用于开发目的,特别是开发基于Windows Server的容器。如果我的理解是正确的,这些容器应该可以在Windows Server上运行,而没有VM。我必须承认,我从来没有检查过。
我希望,这种混乱的解释可能会帮助人们更好地理解这个主题。

2uluyalo

2uluyalo4#

我们需要一个VM来在主机上运行docker(这是通过docker工具箱实现的),如果是windows,在Linux上我们甚至不需要这个。一旦我们有了一个Docker工具箱容器,它本身就不需要VM,每个容器都有一个非常小的基线映像,并且在主机内核中重用了很多东西,因此与VM相比,它是轻量级的。您可以使用单个主机内核运行许多这样的容器。

相关问题