码头工人的临时形象是什么?

Pro*_*jol 14 docker

我是Docker的新手,我正在尝试文档中的第一个hello world示例。据我了解,hello-world图像基于暂存图像的顶部。有人可以解释一下刮擦图像的工作原理吗?据我了解,它本质上是空白的。那么如何在hello-world映像中执行二进制文件?

yam*_*enk 20

scratch映像是Docker中最小的映像。这是所有其他图像的基础祖先。该scratch图像实际上是空的。它不包含任何文件夹/文件...

scratch图像主要用于构建其他基础图像。例如,debian映像是从头开始构建的,如下所示:

FROM scratch
ADD rootfs.tar.xz /
CMD ["bash"]
Run Code Online (Sandbox Code Playgroud)

rootfs.tar.xz包含了所有的文件系统文件。Debian映像将文件系统文件夹添加到暂存映像,该映像为空。

据我了解,它本质上是空白的。那么如何在hello-world映像中执行二进制文件?

暂存映像为空白。添加到暂存映像的hello-world可执行文件实际上是静态编译的,这意味着它是自包含的,不需要执行任何其他库。

官方docker docs所述

假设您从Docker GitHub示例C源代码构建了“ hello”可执行示例,并使用-static标志对其进行了编译,则可以使用以下命令构建该Docker映像:docker build --tag hello

这确认了hello-world可执行文件是静态编译的。有关静态编译的更多信息,请阅读此处

  • C程序员的脚注,“ ...表示它是独立的,不需要任何其他库”,这意味着**甚至没有glibc **,因此没有`printf`。您无法进行系统调用。如果您想知道为什么[hello.c](https://github.com/docker-library/hello-world/blob/master/hello.c)使用`syscall`,[本文](https:/ /blogs.oracle.com/linux/hello-from-a-libc-free-world-part-1-v2)进行了更详细的介绍。 (2认同)

tel*_*tel 5

聚会有点晚了,但添加了 @yamenk 的答案。

从技术上讲,Scratch 并不是图像,但它只是一个参考。容器镜像的构建方式是利用底层内核,仅提供内核内存在的工具和系统调用。因为在 Linux 中一切都是文件,所以您可以将任何独立的二进制文件或整个操作系统作为文件添加到此文件系统中。

这意味着从 Scratch 创建映像时,技术上指的是主机系统的内核以及加载其之上的所有文件。这就是为什么从头开始构建也不是无操作操作,并且当仅添加单个二进制文件时,图像的大小只是该二进制文件的大小加上一点开销。

在容器中执行映像时可以通过利用 cgroups 功能来分配资源,而网络则利用 Linux 网络命名空间技术。