OS docker 容器:那么与 VM 有什么区别?

Mic*_*ael 12 docker

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

在 docker 存储库中,您会找到一个 Ubuntu docker 镜像:https : //registry.hub.docker.com/_/ubuntu/ 我认为 Docker 更像是在“应用程序”级别。

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

谢谢

Xav*_*cas 13

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

您需要了解的第一件事是 Docker 的哲学:在容器中运行一个隔离的进程。您不会在 Docker 容器中运行操作系统,您将在容器内运行一个进程,该进程具有基于您选择的 linux 发行版的根文件系统内容。Ubuntu 是其中的一个选择。

现在您应该想知道如何让进程在与您的主机运行的 linux 发行版不同的 linux 基础映像中运行。要运行操作系统,您基本上需要:

  • 引导文件系统:包含引导加载程序和加载后将驻留在内存中的内核。对于 Docker 容器,我们不关心这一点,因为内核与主机共享,并且是所有 linux 发行版之间的公共部分。
  • 根文件系统:包含文件系统结构。它可能因一个 linux 发行版而异。在启动序列完成之前,它是只读的。

Docker 使用 UnionFS 来管理容器内的磁盘块层,以便您可以堆积它们。

在幕后,它使用联合挂载,允许同时挂载多个文件系统,看起来像一个完整的虚拟系统。实际上,它以只读模式将基础镜像层作为读写模式放置在基础根文件系统之上。

在这里,您有一堆磁盘块,其分层方式是基本映像来自的 linux 发行版将包含相同的文件系统,一旦安装在真实主机中,但这次它位于容器内。

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

答案是:命名空间。我不会在这里详细介绍,因为它会偏离最初的问题。但是您需要知道的是,从内核 2.4.19 开始,多年来出现了各种名称空间。目前有以下命名空间可用:

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

命名空间是内核内部的独立结构,允许进程在特定环境中运行。例如,MNT 命名空间将是使进程在基本映像根文件系统特性中运行的关键特性。NET 命名空间将是容器具有特定网络接口以便与 d​​ocker 网桥等进行通信的另一个关键功能。

所以,是的,所有这些的主要目的是运行一个隔离的应用程序,在一个叫做容器的盒子里轻松地将它从本地环境传送到生产环境。

在深入研究之前阅读docker 的文档是个好主意。

  • @YAmikep 由于未正确清理依赖项,某些图像可能很大。如果您使用相同的映像启动 10 个容器,那么这并不意味着使用的磁盘空间将是映像大小的 10 倍。您一次下载一个映像,但从多个容器中运行它。当从同一个镜像运行多个容器时,Docker 使用写时复制,这基本上意味着它会在容器之间共享镜像,并且只有当容器添加/修改它时,它才会在镜像内创建一个文件的私有副本。所以实际使用的大小与容器内的活动有关,而不是运行的次数。 (2认同)