简单的docker概念

我正在开始使用Docker指南,了解除了一个概念之外的大部分基础知识。

码头图片截图

我得到docker/whalesay如何占用247 MB 。 它需要下载几个图层,包括Ubuntu的基础镜像。 但是, hello-world应该是相同的大小? 这是一个独立的图像,可以运到任何地方。

hello-world执行时,仍然有一个Linux层在某处运行,而且我还在docker/whalesay之前下载了hello-world ,所以它不能使用从docker/whalesay下载的Linux层。 我在这里错过了什么?

这不是一个Ubuntu的实例。 检查中心: https : //hub.docker.com/_/hello-world/

这里如果你点击最新的,你可以看到dockerfile:

 FROM scratch COPY hello / CMD ["/hello"] 

FROM定义了它所基于的操作系统。 Scratch是一个“空”的形象,如下所述: https : //hub.docker.com/_/scratch/

看着Dockerfile清除了一切 – 它不使用任何基本的图像,即Ubuntu等:

 FROM scratch COPY hello / CMD ["/hello"] 

第一个指令FROM声明了我们打算构build的新镜像的基础镜像。 从文档 :

FROM指令为后续指令设置基本映像。 因此,有效的Dockerfile必须具有FROM作为其第一条指令。 该图像可以是任何有效的图像 – 从公共存储库中拉取图像非常容易。 (Docker Hub)

FROM scratch (没有办法使用任何基本图像,因此迷你图像大小)是一个特殊的情况 – scratch保留 – 从文档 :

FROM scratch

这个图像在构build基本的图像(比如debian和busybox)或者超级最小的图像(只包含一个二进制文件以及它所需要的任何东西,比如hello-world)的情况下是非常有用的。

从Docker 1.5.0(特别是docker / docker#8827)开始,从头开始是Dockerfile中的一个no-op,并且不会在图像中创build额外的图层(所以之前的2层图像将是1层的图像) 层图像 )。


编辑1 – OP的新评论,进一步澄清:

为了澄清,Docker安装了一个非常小的Linux dist。 而这个令人难以置信的简单的hello-world映像使用Docker附带的默认Linux dist?

Paul Becotte的一个很好的说明:

没有。Docker不包含内核 – 它不是虚拟机。 这是一种在现有内核上运行进程的方式,以欺骗他们认为他们完全孤立。 图像的大小实际上是一个“根文件系统”…在这种情况下,文件系统只包含一个文件,这就是为什么它很小。 这个过程实际上是在运行Docker Daemon的内核 (你安装了Docker的Linux机器)上执行的,并且被chroot化到了容器文件系统中。


为了进一步澄清 – 我分享了一个使用阿尔卑斯山最小图像的例子:

基于Alpine Linux的最小的Docker镜像,具有完整的包索引,只有5 MB大小!


PS如果hello-world上没有任何基础图像,甚至不是一个微型的。