【问题标题】:Simple Docker Concept简单的 Docker 概念
【发布时间】:2016-09-07 13:16:31
【问题描述】:

我正在阅读getting started 与 Docker 指南,并了解了除了一个概念之外的大部分基础知识。

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

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

【问题讨论】:

    标签: linux docker containers


    【解决方案1】:

    它不是一个 ubuntu 实例。检查集线器: https://hub.docker.com/_/hello-world/

    这里如果点击latest,可以看到dockerfile:

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

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

    【讨论】:

    • 所以它正在将 hello 程序复制到我主机上的当前工作目录?
    • 据我了解,它永远不会在工作目录上创建目录,它仍然是一个具有自己环境的独立图像,它真的很小。所以它的存储方式与所有 docker 图像的存储方式相同。例如,它上面没有包管理器。但是您可以使用它作为基础来创建更大的图像,以确保您不需要任何东西。像这个图像和busybox这样的东西通常用于像树莓派这样较弱的硬件。
    【解决方案2】:

    查看Dockerfile 可以解决问题 - 它没有使用任何基础映像,即 Ubuntu 等:

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

    第一个指令FROM 说明了我们打算构建的新镜像的基础镜像。来自docs

    FROM 指令为后续指令设置基本映像。 因此,有效的Dockerfile 必须将FROM 作为其第一条指令。 图像可以是任何有效的图像——特别容易上手 从公共存储库中提取图像。 (码头工人中心)

    FROM scratch(不可能使用任何基本图像,因此使用迷你图像大小)是一种特殊情况 - 术语scratch 是保留的 - 来自docs

    FROM scratch

    此图像在构建基础图像(例如 作为 debian 和 busybox)或超级最小图像(仅包含 单个二进制文件和它需要的任何东西,例如 hello-world)。

    还有

    从 Docker 1.5.0(特别是 docker/docker#8827)开始,从头开始是 Dockerfile 中的无操作,并且不会在您的 图像(因此之前的 2 层图像将改为 1 层图像)。


    EDIT 1 - OP 的新评论进一步澄清:

    为了澄清,Docker 安装了一个非常小的 Linux dist。 这个非常简单的 hello-world 镜像使用了默认的 Linux Docker自带的dist?

    Paul Becotte 的一个很好的解释:

    没有。 Docker 不包含内核——它不是虚拟机。它 是一种在现有内核上运行进程的方法 欺骗他们认为他们是完全孤立的。的大小 图像实际上是一个“根文件系统”......在这种情况下,文件 系统只包含一个文件,这就是它很小的原因。 该 进程实际上在运行的内核上执行 Docker 守护进程(你安装了 Docker 的 Linux 机器),它被 chroot'ed 到容器文件系统。


    为了进一步澄清-我正在分享一个使用最小图像Alpine的示例:

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


    P.S.hello-world 的情况下,没有任何基本图像,甚至是简约的。

    【讨论】:

    • 澄清一下,Docker 安装了一个非常小的 Linux dist。而这个非常简单的hello-world 映像使用的是 Docker 附带的默认 Linux 分区?
    • 没有。 Docker 不包含内核——它不是虚拟机。这是一种在现有内核上运行进程的方法,以诱使它们认为它们是完全隔离的。图像的大小实际上是一个“根文件系统”......在这种情况下,文件系统只包含一个文件,这就是它很小的原因。该进程实际上在运行 Docker 守护进程的内核上执行,并将其 chroot'ed 到容器文件系统。
    • @PaulBecotte 和@Nabeel 感谢您的所有澄清。我非常接近理解。当您说它在运行 Docker 守护程序的内核上运行时,这是否意味着 hello-worldbinary 是从我的 Mac OS X Yosemite 内核运行的,因为我使用的是 Docker for Mac?如果我在 Linux 上使用 Docker,澄清是有道理的,但由于我在 Mac 上,我认为它会在 Docker 附带的小型 Linux 内核上运行,或者现在在你的解释之后,脱离 Mac UNIX 内核。跨度>
    • 不,对不起。 Docker for Mac 包含一个实际的 linux 虚拟机,它运行一个 docker 守护进程并将你的 docker 命令代理到该机器。因此,Docker for Mac 安装了 linux - 但这与您的任何图像无关。
    • @PaulBecotte 但是当涉及到hello-world 映像时,当我使用 Docker for Mac 时,它正在运行该 linux 虚拟机,对吗?
    猜你喜欢
    • 2012-04-20
    • 2014-06-12
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多