Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker容器不需要操作系统,但每个容器都有一个操作系统。为什么?_Docker - Fatal编程技术网

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

docker容器不需要操作系统,但每个容器都有一个操作系统。为什么?,docker,Docker,“docker”是当今的流行语,我正试图弄清楚它是什么以及它是如何工作的。更具体地说,它与普通VM(例如VirtualBox、HyperV或WMWare解决方案)有何不同 文档()的引言部分内容如下: 容器在主机内核上本机运行应用程序。与仅通过虚拟机监控程序对主机资源进行虚拟访问的虚拟机相比,它们具有更好的性能特征。容器可以获得本机访问,每个容器都在一个离散的进程中运行,不占用比任何其他可执行文件更多的内存 宾果!这就是区别。容器直接运行在托管操作系统的内核上,这就是它们如此轻量级和快速的原因(

“docker”是当今的流行语,我正试图弄清楚它是什么以及它是如何工作的。更具体地说,它与普通VM(例如VirtualBox、HyperV或WMWare解决方案)有何不同

文档()的引言部分内容如下:

容器在主机内核上本机运行应用程序。与仅通过虚拟机监控程序对主机资源进行虚拟访问的虚拟机相比,它们具有更好的性能特征。容器可以获得本机访问,每个容器都在一个离散的进程中运行,不占用比任何其他可执行文件更多的内存

宾果!这就是区别。容器直接运行在托管操作系统的内核上,这就是它们如此轻量级和快速的原因(此外,它们以docker hub的形式提供进程隔离和良好的分发机制,这很好地发挥了容器之间连接的能力)

但是等一下。我可以使用docker在windows上运行Linux应用程序-怎么可能?当然,有一些虚拟机。否则我们就无法完成任务

好的,但是当我们在Linux主机上工作时,它看起来是什么样子的???这才是真正的困惑。。。仍然有人将OS定义为我们要创建的每个映像的基础映像。即使我们说“从头开始”-从头开始仍然是一些极简内核。。。所以来了

问题1:如果我运行例如CentOS主机,我是否可以创建容器,该容器将直接使用该主机操作系统的内核(而不是VM,它包含自己的操作系统)?如果是,我怎么做?如果没有,为什么docker的文档对我们来说是谎言(因为docker映像总是在某些VM中运行,并且它与其他VM没有太大的区别,或者说是ist?)

经过一些思考和环顾四周后,我想知道是否对运行图像进行了一些优化。来了

问题2:如果我运行两个容器,其中两个容器的图像都基于相同的父图像,该父图像是否只加载到内存中一次?每个容器会有一个VM,还是只有一个运行两个容器的VM?如果我们使用不同的操作系统呢

第三个问题很难回答:

问题3:是否有一些资源描述了这类事情。。。因为大多数讨论docker的文章都说“它太酷了,你一定要使用ut。只需运行一个命令就可以了。”。。。这并不能解释太多

谢谢。

Docker“容器”不是虚拟机;它们只是在主机系统上运行的常规进程(因此总是在主机的Linux内核上),具有一些特殊的配置,可以将它们与系统的其余部分隔离开来

通过在容器中启动一个进程并在容器外执行
ps
操作,您可以自己看到这一点;您将在主机的所有进程列表中看到该进程。但是,在容器化进程中运行
ps
,将仅显示该容器中的进程;限制系统上进程的视图是集装箱化提供的设施之一

容器通常还可以查看许多其他系统资源(如文件、网络接口和用户)的有限视图或单独视图。特别是,容器化进程通常被赋予一个完全不同的根文件系统和一组用户,使其看起来几乎像是在一台单独的机器上运行。(但事实并非如此;它仍然共享主机的CPU、内存、I/O带宽,最重要的是,还共享主机的Linux内核。)

要回答您的具体问题:

  • 在CentOS(或任何其他系统)上,您创建的所有容器都使用主机的内核。无法创建使用不同内核的容器;为此,您需要启动一个虚拟机

  • 图像只是磁盘上的文件;这些文件以与任何文件相同的方式“加载到内存中”。因此,对于共享父映像中文件的任何特定磁盘块,内存中永远不会同时存在该磁盘块的多个副本。但是,每个容器在用于处理写操作的基本映像层之上都有自己的私有“透明”文件系统层,因此,如果更改文件,更改的块将存储在那里,并且现在将与其他进程(没有更改该文件中的任何块)看到的底层映像分离

  • 在Linux中,您可以尝试
    man cgroups
    man cgroups\u名称空间
    来获得关于cgroups机制的一些相当技术性的细节,Docker(以及Linux上的任何其他容器化方案)使用cgroups机制来限制和更改容器化进程所看到的内容。对于与此直接相关的阅读资料,我没有任何其他特别的建议,但我认为了解进程和各种其他系统在Unix和POSIX系统上的工作原理的技术细节可能会有所帮助,因为了解这一点可以让您了解容器化所做的事情的背景。也许可以从学习chroot(2)系统调用开始,并用它编程一点(甚至可以玩chroot(8)程序);这将为您提供一个实际操作的示例,说明如何在集装箱运输的某个特定领域进行操作

  • 后续问题:

  • 没有内核版本匹配;只有一个主机内核被使用过。如果容器中的程序不能在该版本的内核上运行,那么您就太倒霉了。例如,尝试在具有4.19或更高版本内核的Linux系统上运行Docker official
    centos:6
    centos:5
    容器,您将在尝试启动时看到
    /bin/bash
    segfults。内核和userland程序不兼容。如果程序试图使用内核中不存在的更新的功能,它同样会失败。这和跑步没什么区别