Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个Docker映像是否应该包含一个JDK?_Java_Docker_Spring Boot_Microservices - Fatal编程技术网

Java 每个Docker映像是否应该包含一个JDK?

Java 每个Docker映像是否应该包含一个JDK?,java,docker,spring-boot,microservices,Java,Docker,Spring Boot,Microservices,所以,我对Docker很陌生。让我解释一下问题的来龙去脉 我有10-20个SpringBoot微服务应用程序,每个应用程序都运行在本地机器的不同端口上 但要迁移到Docker,根据我的学习,每个服务必须位于不同的Docker容器中,以便快速部署或复制 对于每个Docker容器,我们需要创建一个新的Docker映像 每个Docker映像必须包含一个JRE,Spring Boot应用程序才能运行。最大容量约为200MB。这意味着每个docker映像最大为350MB。 另一方面,在我的本地PC上,我只

所以,我对Docker很陌生。让我解释一下问题的来龙去脉

  • 我有10-20个SpringBoot微服务应用程序,每个应用程序都运行在本地机器的不同端口上

  • 但要迁移到Docker,根据我的学习,每个服务必须位于不同的Docker容器中,以便快速部署或复制

  • 对于每个Docker容器,我们需要创建一个新的Docker映像

  • 每个Docker映像必须包含一个JRE,Spring Boot应用程序才能运行。最大容量约为200MB。这意味着每个docker映像最大为350MB。 另一方面,在我的本地PC上,我只有一个200MB的JRE,每个应用程序只占用几MB的空间

  • 基于此,我的本地系统需要600MB,但所有Docker映像需要7GB

  • 这种方法正确吗?DockerHub中的“OpenJDK”应该添加到每个图像中吗


    为什么即使目标PC可能已经有JDK,图像的大小仍然很大?

    您的理解是不正确的

    Docker图像由层构成;见下图:

    当您在映像中安装JRE时,让我们假设它的校验和是
    91e54dfb1179
    ,在下一张图片中,它将真正占用您的磁盘

    但是,如果您的所有容器都基于相同的图像,并且添加了不同的内容,例如,您的不同微服务应用程序到薄R/W层,那么所有容器都将共享
    91e54dfb1179
    ,因此这将不是n*m关系

    您需要注意尽可能多地为所有Java应用程序使用相同的基本映像,并向精简的R/W层添加不同的内容

    很好,但我想补充一点,Docker容器的大小应该尽可能小,以便于转移和存储

    因此,有很多基于分布的容器,它们非常小。如果可能的话,试着使用它们


    此外,不要将所有可以想象的工具都添加到您的容器中,例如,您通常可以不使用wget…

    其他答案很好地涵盖了Docker分层,因此我只想为您的问题添加详细信息

    这种方法正确吗?DockerHub中的“OpenJDK”应该添加到每个图像中吗? 对。如果它不在图像中,它就不会在容器中。不过,您可以通过尽可能多地重用层来节省磁盘空间。所以,试着把你的Dockerfile从“最不可能改变”改为“最有可能改变”。因此,在构建图像时,看到“使用缓存”的次数越多越好

    为什么即使目标PC可能已经有JDK,图像的大小仍然很大? Docker希望尽可能少地与主机打交道。Docker甚至不想和主机打交道。它做的第一件事是创建一个要隐藏的VM。Docker images假定主机只提供空ram、磁盘和CPU。因此,每个Docker映像还必须包含自己的OS/内核。(这就是您最初的FROM所做的,选择要使用的基本OS映像)因此,您的最终映像大小实际上是OS+工具+应用程序。不过,图像大小有点误导,因为它是所有层的总和,可以在图像中重用

    (暗示)每个应用程序/微服务是否应该放在自己的容器中? 理想情况下,是的。通过将应用程序转换为一个独立的模块,可以更轻松地替换/平衡该模块

    实际上,也许不是(对你而言)。Spring Boot不是一个轻量级的框架。事实上,它是一个模块化代码的框架(有效地在模块控制系统内运行模块控制系统)。现在你想主持10-20场?这可能无法在单个服务器上运行。Docker将强制Spring boot将自己加载到每个应用程序的内存中;而且对象现在不能跨模块重用,所以这些也需要多实例化!如果您仅限于一台生产服务器,则水平扩展不是一个选项。(根据您的代码库,每个Spring引导需要~1GB的堆(RAM)。对于10-20个应用程序,为Docker部署而进行重构以使应用程序更轻可能是不可行的/在预算内。更不用说,如果您不能在本地运行最低限度的测试设置(RAM不足),开发工作将获得更多的“乐趣”

    码头工人不是金锤。尝试一下,自己评估利弊,并决定对你和你的团队来说,利弊是否值得

    基于此,我的本地系统需要600MB,但需要7GB 对于所有Docker图像

    这种方法正确吗?DockerHub中的“OpenJDK”应该添加到 每张照片

    这是正确的。而你可能会想,JRE是否还不够

    为什么即使目标PC可能已经存在,图像的大小仍然很大 你有JDK吗

    比较不可比较的事物本地环境(除了生产机器之外)与集成/生产环境

    在集成/生产环境中,应用程序的负载可能很高,通常建议在应用程序之间进行隔离。因此,在这里,您希望通过计算机(裸机、VM或容器)承载最少数量的应用程序(ui/服务),以防止应用程序之间的副作用:共享库不兼容、软件升级副作用、资源匮乏、应用程序之间的连锁故障

    在本地环境中,应用程序的负载非常低,应用程序之间的隔离通常不是一个严重的问题。因此,您可以在本地计算机上托管多个应用程序(ui/服务),还可以共享操作系统提供的一些公共库/依赖项。 虽然你可以做到这一点,但在本地混合和共享所有内容真的是一种好的做法吗? 我不认为是因为:
    1) 本地计算机不是一个bin:您可以