我在Dockerfile下方”
FROM openjdk:12.0.2
EXPOSE 8080
ADD ./build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
生成的Docker映像封装了Java程序。当我将此Docker映像部署到Windows Server或Linux时,该映像是否始终包括运行在主机OS(Windows Server或Linux)之上的Linux之类的OS?
我问这个问题的意义是Docker映像是包含其他框的物理框(一个是openjdk),该框是否还包含我可以拉出的Linux OS框(假设是否可行)并且在空机上将其作为Linux OS安装吗?
答案 0 :(得分:2)
这取决于您所说的“操作系统”。它始终包含发行映像中的内容,它是建立在上面的。
例如,基于debian的映像将包括apt
和其他特定于debian的工具。但是,在“完整”机器上(例如在非容器中)所需的大多数东西都将被删除,以使图像尽可能小。
它将不包含内核,因为它在主机上运行并且由主机的内核控制。
答案 1 :(得分:1)
它不包含整个操作系统,但是该映像将依赖于linux或Windows,因此您无法在一个Dockerfile中构建可同时在两者上运行的映像。 产生这种依赖性的原因是,一个Docker容器以一种谨慎的隔离方式与其主机共享资源,这种机制在Windows和Linux上是不同的(尽管对您来说,作为Docker用户,这种区别是不可见的)。
答案 2 :(得分:1)
来自Docker Hub的“官方” OpenJDK映像基于多种不同的Linux发行版以变体形式提供。这里有一个缩减版的Debian,一个Alpine等。每种都有优点和缺点。
该映像将需要包含足够的操作系统依赖性,以允许JVM运行。它还可能包括基本的诊断和管理工具-无论如何,足以对容器进行基本的故障排除。您可以期望所有映像至少包含基本的控制台外壳工具,例如“ cp”和“ cat”,尽管它们的实现方式有所不同。例如,Alpine变体从BusyBox中获取这些实用程序,而不是从常规的GNU / Linux安装中获取。
可以创建一个完全不包含平台依赖项的Docker映像,但是几乎没有动机将其最小化-您只需要在应用程序本身中构建更多内容即可。