我正在阅读使用Docker指南的getting started并了解除了一个概念之外的大部分基础知识。
我了解docker/whalesay
占用247 MB
的方式。它需要下载几个层,包括ubuntu的基本映像。但是hello-world
应该大小相同吗?这是一个可以随处运送的独立图像。
当hello-world
执行时,仍有一个Linux层在某处运行它,我还在hello-world
之前下载了docker/whalesay
,因此它无法使用从{{{}下载的Linux层。 1}}。我在这里缺少什么?
答案 0 :(得分:2)
它不是ubuntu实例。检查集线器: https://hub.docker.com/_/hello-world/
如果你点击最新,你可以看到dockerfile:
FROM scratch
COPY hello /
CMD ["/hello"]
FROM定义了它所基于的操作系统。 Scratch是一个“空”图像,如下所述:https://hub.docker.com/_/scratch/
答案 1 :(得分:1)
调查Dockerfile清除了事情 - 它没有使用任何基本图像,例如Ubuntu等:
FROM scratch
COPY hello /
CMD ["/hello"]
第一个指令FROM
表示我们打算构建的新图像的基本图像。来自docs:
FROM
指令为后续指令设置基本映像。 因此,有效Dockerfile
必须有FROM
作为其第一条指令。 图像可以是任何有效图像 - 开始时特别容易 从公共存储库中提取图像。 (Docker Hub)
并且FROM scratch
(不能使用任何基本图像,因此迷你图像大小)是一种特殊情况 - 术语scratch
是保留的 - 来自docs:
<强>
FROM scratch
强>此图像在构建基本图像的环境中最有用(例如 作为debian和busybox)或超级最小图像(仅包含一个 单个二进制及其所需的任何内容,例如hello-world)。
也
从Docker 1.5.0(特别是docker / docker#8827)开始,FROM scratch是 Dockerfile中没有操作,并且不会在你的文件中创建额外的图层 图像(因此之前的2层图像将是 1层图像)。
编辑1 - OP的新评论进一步澄清:
为了澄清,使用Docker安装了一个非常小的Linux dist。 这个非常简单的hello-world图像使用默认的Linux Docker附带的dist?
Paul Becotte的一个很好的澄清:
没有。 Docker不包含内核 - 它不是虚拟机。它 是一种以现有方式在现有内核上运行进程的方法 欺骗他们认为他们是完全孤立的。的大小 图像实际上是一个&#34;根文件系统&#34; ...在这种情况下,文件 系统只包含一个文件,这就是它很小的原因。的的 进程实际上是在运行该进程的内核上执行的 Docker守护程序(您在其上安装了Docker的Linux机器),并将其chroot转移到容器文件系统。
进一步澄清 - 我正在分享一个使用最小图片Alpine的例子:
基于Alpine Linux的最小Docker镜像,包含完整的包 索引,只有5 MB大小!
P.S。如果是hello-world
,那么任何基本图像都不会是微小的图像。