简单的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
上没有任何基础图像,甚至不是一个微型的。