在Docker的“从零开始”中,将运行哪个操作系统?

11
在docker的hello-world示例中,基础镜像为Scratch,那么如果我没有在基础镜像中指定任何操作系统,命令会在哪里执行?
它会在Docker软件中执行,不会在主机操作系统(我的操作系统是Mac)中执行,也不会内部创建任何操作系统。
如果它在主机操作系统中执行,那么我将编写Mac命令(我的主机操作系统是Mac),现在如果我将该映像文件交给某人,他的操作系统是Windows,它能运行吗?

Docker不带操作系统,它在主机操作系统中执行。 - Robert Harvey
如果它在主机操作系统中执行,那么我将编写Mac命令(我的主机操作系统是Mac),现在如果我将该映像文件提供给某个人,他的操作系统是Windows,它能运行吗? - trinath
那是一个比你最开始写的更好的问题。 - Robert Harvey
@trinath 在Windows和Mac上,Docker引擎无法直接运行,而是在Linux主机虚拟机中运行。 - undefined
2个回答

12

“操作系统”一词有点过载。

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

“操作系统”还可以暗示在内核之上运行的库、实用程序和程序堆栈。Docker让您运行Ubuntu用户空间、Alpine用户空间或其他用户空间...或不运行任何用户空间。这些之间可能存在轻微的不兼容性(如果您在GNU libc中使用了一些特定的东西;如果您认为/bin/sh总是GNU bash;...)。

通常情况下,您不希望使用FROM scratch。除了Docker为您提供的/proc/dev等几个位,您将会得到nothing。例如,您将不会获得shell。只有当您具有静态链接的Linux二进制文件并且出于某种原因想将其包装在容器中时,它才是最有用的(您的应用程序通常必须使用C、C++或Go编写,并且需要采取特殊步骤进行静态链接)。

Docker永远不会在主机上运行命令(特别是如果涉及VM层),如果您的程序的主要目标是与主机程序交互或读写主机文件,则您 actively 不想要Docker提供的隔离。一个不同的打包系统可能对您更有效。


我在想是否可以摆脱 FROM scratch,但仍然有一个输出“hello world”的容器?这是可能的吗? - flow2k
1
刚刚问了问题并得到了答案:https://dev59.com/q7bna4cB1Zd3GeqPhtUp - flow2k

1
scratch 镜像被用作二进制可执行文件的“容器”。在 hello-world 示例中,
FROM scratch
COPY hello /
CMD ["/hello"]

你好,hello 是一个使用 gcc 编译的可执行文件。

如果你想要使用 scratch,你需要编译你的代码,架构取决于你想在哪里运行它。例如,在现代个人电脑上,它将是 amd64,在树莓派上,它将是 arm*。

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

注意:因为 Docker for Mac 和 Docker for Windows 使用 Linux VM, 所以你需要一个 Linux 二进制文件,而不是 Mac 或 Windows 二进制文件。

回到你的问题,对于 Mac、Windows 和 Linux,Docker 将像在 Linux 中一样执行二进制文件。你不能使用任何 Mac 命令与 scratch,因为它应该是一个内部可执行文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接