在将运行操作系统的Docker'From Scratch'中

时间:2018-11-29 15:34:59

标签: docker

在docker hello-world示例中,基本映像是Scratch,因此,如果我在基本映像中未提及任何os,则命令将在其中执行。 它将在主机操作系统(我的操作系统是mac)中执行还是 它会在docker软件中执行还是 将在内部创建任何操作系统

如果它在主机操作系统中执行,那么我将编写mac命令(我的主机操作系统是mac),现在,如果我将该映像提供给他的操作系统是Windows的某个程序,它可以运行吗?

2 个答案:

答案 0 :(得分:1)

“操作系统”一词已经有点过头了。

Docker容器始终在Linux内核上运行(本机Windows容器除外)。在非Linux系统(例如, ,Mac)上,有一台Linux虚拟机,并且容器始终在该VM上运行。所有容器都共享该“主机”或VM内核(默认情况下,禁止进行可能影响整个系统的更改)。

“操作系统”也可能意味着一堆在内核之上运行的库,实用程序和程序。 Docker允许您运行Ubuntu用户空间,Alpine用户空间或其他用户空间...或者根本没有用户空间。两者之间可能存在较小的不兼容性(如果您在GNU libc中使用了一些特定的东西;如果您相信/bin/sh始终是GNU bash; ...)。

您通常不希望FROM scratch。除了Docker提供给您的/proc/dev之类的代码之外,您什么都没得到。例如,您没有外壳。如果您具有静态链接的Linux二进制文件,并且出于任何原因要将其包装在容器中(您的应用程序通常必须使用C,C ++或Go编写,并且需要采取特殊步骤将其静态链接),则这是最有用的

Docker永远不会导致命令在主机上运行(尤其是涉及到VM层时),并且如果您程序的主要目标是与主机程序进行交互或读写主机文件,那么您主动不希望隔离Docker提供的。不同的包装系统可能会更适合您。

答案 1 :(得分:0)

scretch映像用作二进制可执行文件的“容器”。在hello-world示例中,

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

hello是使用gcc构建的可执行文件。

因此,如果您打算使用scretch,则必须编译代码,该体系结构取决于您要启动它的位置。例如,在现代PC上,它将是amd64;在respberry pi上,它将是arm *。

报价:https://docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch

  

注意:由于Mac的Docker和Windows的Docker使用Linux VM,   您需要Linux二进制文件,而不是Mac或Windows二进制文件。

回到您的问题,对于mac窗口和Linux,Docker将像在Linux中一样执行二进制文件。您不能在scratch中使用任何mac命令,因为它应该是其中的可执行文件。