如今,“ docker”是一个时髦的词,我试图弄清楚它是什么以及它如何工作。更具体地说,它与普通VM(例如VirtualBox,HyperV或WMWare解决方案)有何不同。
该文档的简介部分(https://docs.docker.com/get-started/#a-brief-explanation-of-containers)内容如下:
容器在主机的内核上本地运行应用程序。与仅通过管理程序虚拟访问主机资源的虚拟机相比,它们具有更好的性能特征。容器可以获得本机访问,每个容器都在一个离散的进程中运行,占用的内存不会超过任何其他可执行文件。
答对了!这是区别。容器直接在托管OS的内核上运行,这就是为什么它们如此轻巧和快速(此外,它们以docker hub的形式提供了进程的隔离和良好的分发机制,在容器之间相互连接的能力方面发挥了很好的作用) 。
但是请稍等。我可以使用docker在Windows上运行Linux应用程序-怎么可能?当然,有一些虚拟机。否则我们将无法完成工作...
好的,但是当我们在Linux主机上工作时,它看起来如何?这确实引起了混乱……仍然有人将OS定义为我们要创建的每个映像的基础映像。即使我们说“ FROM暂存器”-暂存器仍然是一些简约的内核...
问题1:如果我运行例如CentOS主机,是否可以创建将直接使用此主机操作系统内核(而不是使用包含其自身操作系统的VM)的容器?如果是,我该怎么办?如果不是,为什么docker的文档对我们说谎(因为docker映像始终在某些VM内运行,而与其他VM并没有太大不同,或者呢?)?
经过一番思考并环顾四周,我想知道是否对运行图像进行了一些优化。来了
问题2:如果我运行两个容器,这两个容器的映像都基于同一父映像,那么此父映像仅会被加载到内存一次吗?每个容器将有一个虚拟机,还是只有一个同时运行两个容器的虚拟机?如果我们使用不同的操作系统呢?
第三个问题颇为棘手:
问题3:在某处有一些资源描述了这种事情……因为讨论Docker的大多数文章都说“太酷了,您一定要使用ut。只需运行一个命令就可以开心”。 ..不会解释太多。
谢谢。
blu*_*hts 19
Docker的容器中没有操作系统。简单来说,docker 容器镜像只是容器镜像所依赖的linux 镜像的一种文件系统快照。
container-image 包含一些基本程序,如 bash-shell、vim-editor 等,以方便开发人员轻松使用 docker 镜像。此外,docker 镜像可以包含预安装的依赖项,如 nodeJS、redis-server 等,我们可以在 docker hub 上找到。
幕后的 Docker 使用主机操作系统(即 linux 本身)来运行其容器。我们以 docker 容器形式看到的类 linux 文件系统快照中包含的程序实际上是在主机操作系统上隔离运行的。
容器映像可能听起来像不同的 linux 发行版,但它们是这些发行版的文件系统快照。所有 Linux 发行版都基于相同的内核。它们在附带的程序、工具和依赖项上有所不同。
另请注意此评论[单击]。它与这个问题非常相关。
希望这可以帮助。
Dmi*_*kin 10
自从我发布这个问题已经很长时间了,但似乎仍然受到点击......所以我决定回答它 - 实际上主要是标题中的问题(文本中的问题由柯特·J·桑普森)。
所以,讨论“主要”问题:如果容器不是虚拟机,那么为什么我们需要虚拟机来代替它们?
您可能会猜到,我正在 Windows 上工作(在 Linux 上不会出现这个问题,因为在 Linux 上不需要用于 docker 的 VM)。
原因很明显,为什么我们需要一个用于 Windows 容器的 VM(可能这就是原因,为什么没有人明确提到它)。正如这里和许多其他常见问题解答中已经提到的,容器重用内核和托管操作系统的一些其他资源。考虑到大多数可用的容器都是基于 Linux 的,因此可以得出结论,这些容器需要主机操作系统来提供 Linux 内核才能运行。这在 Windows 上并不容易(我不确定,现在 Linux 子系统可能是可能的)。这就是为什么在 Windows 上我们需要一个 VM,它在这个 VM 中运行 Linux 和 docker 服务。然后,当我们启动容器时,它们也在这个 VM 中启动(并重用其 Linux 操作系统的资源)。所有容器都在同一个 VM 中运行。获得更多技术:默认情况下,docker 使用 Hyper-V 来运行这个 linux VM,但也可以使用 Docker-Toolbox,它使用 Oracle VirtualBox。顺便说一句,VM可以在Virtual Box界面中自由查看。好的部分是 Docker(或 Docker 工具箱)负责管理这个 VM,我们不需要关心它。
现在有一些额外的问题,那次让我更加困惑。有人可能会想:“好吧,现在很清楚了。如果我们在 Winodws OS 上运行 Linux 容器,那么我们需要 Linux 内核,因此需要使用 Linux 的 VM。但是如果我们在 Windows 上运行 Windows 容器(顺便说一下,它存在),那么应该不需要VM,对吗?...”答案:“错误”(或几乎错误)。:) 问题是,基于 Windows 的容器(至少是我看到的那些)使用 Windows Server 内核,这在 Windows 10 中是不可用的。因此,仍然需要运行特殊版本的 Windows Server 的 VM。事实上,微软甚至创建了特殊版本的 Windows Server,它可以在 VM 上免费运行用于开发目的,专门用于开发基于 Windows-Server 的容器。如果我的理解正确的话 这些容器应该可以在没有 VM 的情况下在 Windows Server 上运行。我应该承认,我从未检查过它。
我希望,这个凌乱的解释可以帮助某人更好地理解这个话题。
Docker“容器”不是虚拟机;它们只是在主机系统(因此总是在主机的Linux内核)上运行的常规进程,具有一些特殊的配置以将其与系统的其余部分分开。
您可以通过在容器中启动进程并在容器ps外部进行操作来自己查看。您将在所有进程的主机列表中看到该进程。ps但是,在容器化过程中运行时,将仅显示该容器中的过程。限制系统上的进程视图是容器化提供的功能之一。
通常还给容器提供许多其他系统资源(例如文件,网络接口和用户)的有限视图或单独视图。特别是,通常给容器化进程一个完全不同的根文件系统和一组用户,这使其看起来几乎好像在单独的计算机上运行。(但不是;它仍然共享主机的CPU,内存和I / O带宽。)
要回答您的特定问题:
在CentOS(或任何其他系统)上,您创建的所有容器都使用主机的内核。无法创建使用其他内核的容器。您需要为此启动虚拟机。
该映像只是磁盘上的文件;这些文件以与任何文件相同的方式“加载到内存中”。因此,不行,对于共享父映像中文件的任何特定磁盘块,在内存中永远不会一次复制该磁盘块。但是,每个容器在用于处理写入的基础映像层上方都有其自己的专用“透明”文件系统层,因此,如果您更改文件,则更改的块将存储在该处,并且现在与该基础映像分开其他过程(尚未更改该文件中的任何块)请参见。
在Linux中,你可以尝试man cgroups,并man cgroup_namespaces获得有关该cgroup机制,这是什么泊坞窗(和Linux上的任何其他集装箱方案)使用,以限制和变化的过程中集装箱所看到的一些相当的技术细节。对于与之直接相关的阅读,我没有任何其他特别的建议,但是我认为这可能有助于学习有关进程和各种其他系统如何在Unix和POSIX系统上正常工作的技术细节,因为理解可以为您提供背景知识了解容器化的功能。也许首先要了解chroot(2)系统调用并对其进行一些编程(甚至可以尝试使用chroot(8)程序);这将为您提供有关一个特定领域的集装箱化实践实例。
后续问题:
没有内核版本匹配;仅使用了一个主机内核。如果容器中的程序不能在该版本的内核上运行,那么您就很不幸了。例如,尝试在具有4.19或更高版本内核的Linux系统上运行Docker官方centos:6或centos:5容器,/bin/bash当您尝试启动它时,将会看到segfaults。内核程序和用户级程序不兼容。如果程序尝试使用内核中没有的较新功能,则同样会失败。这与在容器外部运行相同的二进制文件(程序库和共享库!)没有什么不同。
Windows和Mac无法运行Linux容器,因为它们不是具有运行Linux程序的适当功能的Linux内核,更不用说支持相同的额外cgroup设施了。因此,当您在这些容器上安装Docker时,通常会安装一个Linux VM来运行容器。几乎总是将其仅安装一个VM并在该VM中运行所有容器。否则,将浪费资源,毫无益处。(实际上,如上所述,能够具有多个不同的内核版本可能会有好处。)
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3032 次  |  
        
|   最近记录:  |