【问题标题】:Separating frontend app / webserver docker container分离前端应用程序/网络服务器 docker 容器
【发布时间】:2022-01-21 10:42:45
【问题描述】:

据我所知,将 Angular 应用程序(或任何前端应用程序)容器化的最常用方法是将编译后的前端应用程序的源代码和网络服务器(即 nginx)打包到一个容器中。

如果我们想通过添加重复的容器来扩展,每个容器都会有一个网络服务器和源代码资产。

是否可以将这两个组件分成两个单独的容器?通过这种方式,我们可以扩展网络服务器,而无需每个容器都拥有相同源代码资产的副本(一遍又一遍)。

我意识到在大多数用例中,这可能不值得像我建议的那样努力(也不实际)拆分。从教育的角度来看,我主要是好奇如何或是否可以做到这一点。此外,如果需要扩展的部分是网络服务器,那么如果规模很大以尽量减少在每个容器中复制相同的静态资产,这将是首选吗?

【问题讨论】:

    标签: angular docker nginx containers


    【解决方案1】:

    如果您的浏览器应用程序代码被编译为静态文件,然后构建到映像中,您可以根据需要运行任意数量的基于该映像的容器,并且它们不会使用任何额外的存储空间。所有容器的临时文件系统都将指向共享的底层映像。

    关于容器需要记住的重要一点是它封装了一个进程,并且容器的文件系统是相互隔离的。在您的假设设置中,拥有一个包含已编译文件的容器是没有意义的,因为它不会运行进程并且其他容器将无法访问这些文件。

    如果您期待 Kubernetes 等集群环境,它们非常擅长将 Docker 映像拉到需要运行的任何位置,但推送“文件”要复杂得多。特别是在这些环境中,我见过的两种成功的方法是您在此处描述的一种,将前端代码编译成图像,或者从更传统的托管环境存储和提供浏览器应用程序(对于静态文件、对象像 Amazon S3 这样的存储运行良好),即使后端在容器中运行。

    【讨论】:

    • 因此,如果我理解正确,您可以将这两个组件分开,但不能分成单独的容器。相反,您可以设置一个 dockerfile 来将源代码编译成一个 docker 映像。然后可以将此图像用作多阶段构建中的父图像,这将为您留下由前端应用程序图像组成的结果图像,例如 nginx 图像。然后可以将生成的图像作为容器运行。
    • 也许换一种方式来思考它:使用多阶段构建很常见,其中第一阶段将应用程序编译为静态文件,第二阶段仅包含静态文件而不是构建工具。但是您需要某种方式来提供文件,因此您将最终图像基于 Nginx 或其他 HTTP 服务器。
    • 另外,您能否澄清一下您的意思,“所有容器的临时文件系统都将指向共享的底层映像。”虽然它基于相同的图像,但生成的容器具有静态文件。如果我们运行该容器的副本,每个副本也将包含静态文件。我可以看到使用相同文件的多个容器而不在容器中保存文件的唯一方法是使用卷。
    • 如果您从同一个镜像运行多个容器,它们没有自己的镜像文件副本,除非它们尝试写入它们。有关更多背景信息,请参阅维基百科对 copy-on-write 语义的讨论。
    • 感谢您提供的知识!非常有用,我在这里找到了更多内容 (docs.docker.com/storage/storagedriver/#container-size-on-disk)。
    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2021-01-17
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多