docker容器不需要操作系统,但每个容器都有一个操作系统。为什么?
“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内核上),具有一些特殊的配置,可以将它们与系统的其余部分隔离开来 通过在容器中启动一个进程并在容器外执行docker容器不需要操作系统,但每个容器都有一个操作系统。为什么?,docker,Docker,“docker”是当今的流行语,我正试图弄清楚它是什么以及它是如何工作的。更具体地说,它与普通VM(例如VirtualBox、HyperV或WMWare解决方案)有何不同 文档()的引言部分内容如下: 容器在主机内核上本机运行应用程序。与仅通过虚拟机监控程序对主机资源进行虚拟访问的虚拟机相比,它们具有更好的性能特征。容器可以获得本机访问,每个容器都在一个离散的进程中运行,不占用比任何其他可执行文件更多的内存 宾果!这就是区别。容器直接运行在托管操作系统的内核上,这就是它们如此轻量级和快速的原因(
ps
操作,您可以自己看到这一点;您将在主机的所有进程列表中看到该进程。但是,在容器化进程中运行ps
,将仅显示该容器中的进程;限制系统上进程的视图是集装箱化提供的设施之一
容器通常还可以查看许多其他系统资源(如文件、网络接口和用户)的有限视图或单独视图。特别是,容器化进程通常被赋予一个完全不同的根文件系统和一组用户,使其看起来几乎像是在一台单独的机器上运行。(但事实并非如此;它仍然共享主机的CPU、内存、I/O带宽,最重要的是,还共享主机的Linux内核。)
要回答您的具体问题:
man cgroups
和man cgroups\u名称空间
来获得关于cgroups机制的一些相当技术性的细节,Docker(以及Linux上的任何其他容器化方案)使用cgroups机制来限制和更改容器化进程所看到的内容。对于与此直接相关的阅读资料,我没有任何其他特别的建议,但我认为了解进程和各种其他系统在Unix和POSIX系统上的工作原理的技术细节可能会有所帮助,因为了解这一点可以让您了解容器化所做的事情的背景。也许可以从学习chroot(2)系统调用开始,并用它编程一点(甚至可以玩chroot(8)程序);这将为您提供一个实际操作的示例,说明如何在集装箱运输的某个特定领域进行操作centos:6
或centos:5
容器,您将在尝试启动时看到/bin/bash
segfults。内核和userland程序不兼容。如果程序试图使用内核中不存在的更新的功能,它同样会失败。这和跑步没什么区别