操作系统docker容器:与VM有何区别?


10

在Docker容器中使用OS有什么意义?

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

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

谢谢

Answers:


11

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

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

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

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

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

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

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

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

答案是:名称空间。我在这里不赘述,因为它会与原始问题有所出入。但是您需要知道的是,自内核2.4.19开始,多年来出现了各种命名空间。当前,以下名称空间可用:

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

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

因此,是的,所有这些操作的主要目的是隔离运行一个应用程序,并通过一个称为容器的盒子轻松地将其从本地环境运送到生产环境。

在深入研究Docker文档之前,最好先阅读一下。


谢谢,这是否意味着像这样的“ Ubuntu”图像:registry.hub.docker.com / _ / ubuntu 本身就没有意义,并且可以作为更定义的容器(如“ nginx容器”)的基础?我不知道我是否有意义?
2015年

是的你是。这就是它的用途。通常,您会听到人们因为这个原因将它们称为基本图片
哈维尔·卢卡斯

我已经阅读了文档,不确定一件事。假设ubuntu图片的大小为140Mb。然后,基于该图像的另一个图像将再增加10 Mb。如果我从该映像运行2个容器,每个容器将为150Mb,并且我需要300Mb磁盘空间,或者总大小将保持150Mb?谢谢
Michael

哇,我刚刚下载了官方python映像,虚拟大小为802.4 MB。下载花了一段时间。如果我从中运行10个容器,这些容器将占用多少空间?谢谢
Michael

2
@YAmikep由于依赖关系未正确清除,因此某些图像可能很大。如果您使用相同的映像启动10个容器,则并不意味着所使用的磁盘空间将是映像大小的10倍。您只下载一次映像,但可以从多个容器中运行它。Docker从同一映像运行多个容器时会使用写时复制,这基本上意味着它会在容器之间共享该映像,并且仅在该容器添加/修改该映像时才会在该映像内创建文件的私有副本。因此,实际使用的大小与容器内的活动相关,而不是与运行次数相关。
哈维尔·卢卡斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.