Java docker容器应该有一个OS发行版吗?

Java docker容器应该有一个OS发行版吗?,java,docker,Java,Docker,我是docker的新手,学习了很多教程。我知道我们可以在docker容器中包含任何东西(数据库、服务器等)。然而,我在许多教程中看到docker映像文件有一个“来自一些OS发行版”(我知道这个发行版不是一个完整的OS,但提供了发行版的实用程序和进程)。我的问题是: 容器是否应该始终具有OS发行版 若有,原因为何?(其他组件(例如:java vm)不能在内核上运行吗?) 如果否:后果是什么?或者一般来说什么是最佳实践? (我来自Java背景)您定义的每个docker映像都必须有from子句,因为它

我是docker的新手,学习了很多教程。我知道我们可以在docker容器中包含任何东西(数据库、服务器等)。然而,我在许多教程中看到docker映像文件有一个“
来自
一些OS发行版”(我知道这个发行版不是一个完整的OS,但提供了发行版的实用程序和进程)。我的问题是:

容器是否应该始终具有OS发行版

若有,原因为何?(其他组件(例如:java vm)不能在内核上运行吗?)

如果否:后果是什么?或者一般来说什么是最佳实践?

(我来自Java背景)

您定义的每个docker映像都必须有from子句,因为它需要基于另一个映像。您可以创建自己的基础映像,但在我看来,您不应该需要它。图像只不过是可以在从图像创建的容器中使用的二进制文件的集合。docker hub上有很多可用的图像,因此最好的做法是将图像保持尽可能小。因此,我推荐基于阿尔卑斯山的基础图像

如果你真的需要一个自己的基础形象看看这里

并对链接的stackoverflow文章进行了评论


docker容器的进程总是使用docker主机的内核,因此docker映像需要与运行容器的主机的内核兼容。docker容器只不过是在主机上运行的一个独立进程,没有特殊的运行时。如果java进程在容器中运行,那么它实际上在主机上运行,当您在docker主机上列出主机进程时,您可以看到它。

我认为问题是“如果我尝试将java二进制文件放置在映像上并从头开始运行它们,会发生什么情况”,不应该发生任何事情,因为scratch是一个显式的空图像,只需告诉docker引擎Dockerfile中的下一个commad生成图像的第一层。Java依赖linux二进制文件来运行Java JVM以及运行时本身,因此scratch映像对于运行Java应用程序是无用的?!您认为这些操作系统映像是如何定义的?必须有一个起点,这意味着不需要从开始。不过我同意,使用
FROM
意味着你必须自己做所有的引导。如果你建立自己的基础映像,你的Dockerfile中没有FROM指令,那么它与你的“从头开始”是一样的,不是吗?好的,Dockerfile中没有FROM指令,但这似乎只是合成糖。