操作系统docker集装箱:与虚拟机有什么不同呢?

Docker容器中使用操作系统有什么意义?

在Docker仓库中,您可以find一个Ubuntu docker镜像: https : //registry.hub.docker.com/_/ubuntu/我认为Docker更多的是“应用程序”级别。

那么Ubuntu Docker容器和Ubuntu虚拟机之间的区别是什么? 如果你在Docker容器中有一个完整的操作系统,那么使用Docker没有意义吗?

谢谢

你缺乏基本的Docker概念。 这是完全不同的事情。

您首先需要了解的是Docker的理念:在容器中运行一个独立的进程 。 您不会在Docker容器中运行操作系统,您将在具有根文件系统内容的容器中运行一个进程,该内容基于您select的Linux发行版。 Ubuntu是其中的一个select。

现在你应该想知道如何在一个与你的主机运行的linux发行版不同的linux基本映像中运行一个进程。 对于一个操作系统来说,你基本上需要:

  • 引导文件系统:包含引导加载程序和加载后驻留在内存中的内核。 我们不关心Docker容器的情况,因为内核是与主机共享的,是所有Linux发行版之间的共同部分。
  • 根文件系统:包含文件系统结构。 它可能不同于一个Linux发行版到另一个。 它是只读的,直到引导序列完成。

Docker使用UnionFS来pipe理一个容器内的磁盘块的层次,以便将它们堆叠起来。

在幕后,它使用联合安装,允许同时安装多个文件系统,看起来像一个完整的虚拟系统。 实际上,它将基本映像层以只读模式放在基本根文件系统之上的读写模式下。

在这里,你有一堆磁盘块,分层的方式是,基本映像来自的Linux发行版包含相同的文件系统,一旦安装在一个真正的主机上,但这次是在一个容器内。

现在缺乏的最后一件事是:你如何运行这个孤立的东西?

答案是:命名空间。 我不会在这里详细讨论,因为它会偏离原来的问题。 但是你需要知道的是,自2.4.19内核以来,多年来出现了各种各样的命名空间。 目前有以下命名空间可用:

  • IPC:IPC命名空间(进程间通信)
  • MNT:挂载命名空间
  • NET:networking命名空间
  • PID:PID命名空间
  • USER:用户名空间(uid)
  • UTS:UTS命名空间(主机名)

命名空间是内核中的独立结构,允许进程在特定的环境下运行。 例如,MNT命名空间将是获得在基本映像根文件系统特定性中运行的进程的关键function。 NET命名空间将是容器具有特定networking接口的另一个关键特性,以便与泊坞桥等进行通信。

所以,是的,所有这些的主要目的是运行一个孤立的应用程序,将它从本地环境运送到一个名为container的容器内。

在深入阅读Docker的文档之前,先阅读Docker的文档是个好主意。