【问题标题】:Converting my Node app to Docker/Kubernetes?将我的 Node 应用程序转换为 Docker/Kubernetes?
【发布时间】:2017-11-02 23:33:14
【问题描述】:

我有一个 Node 应用程序,它由几个独立的模块组成,通过 AMQP 相互通信。这个应用程序由一个 index.js 文件启动,该文件将我项目不同文件夹中的所有其他 index.js 实例化,进而实例化实际模块。

我一直在阅读有关微服务的文章,并且想将我的应用程序转换为 Docker 容器。我找到了如何将简单的 Node 应用程序转换为 Docker 的示例,但我想分离我的应用程序,以便每个模块都在一个独立的 Node 容器中(这是因为每个模块都是独立的并且不依赖于其他模块来工作。他们从消息队列接收工作,并将结果放在消息队列中)。

我找不到有关如何组织和部署代码的信息。我应该为每个模块创建一个不同的 Node 项目(带有单独的 packages.json)吗?还是应该为我的所有模块创建一个 Node 项目并单独部署它们?

在我组织好我的项目之后,是否有一个脚本工具可以将我的每个模块生成(构建*和部署)到它自己的容器中?到目前为止,我发现的所有示例都是仅打包一个应用程序的“hello world”级别示例。

在开发过程中,我是否必须为我测试的每个更改部署新容器?

*:构建是因为我使用 ES6,我必须使用 Babel。

【问题讨论】:

    标签: node.js docker continuous-integration kubernetes microservices


    【解决方案1】:

    我应该为每个 Dockerfile 有一个单独的 packages.json 吗? 根据我的阅读,我了解 Dockerfile 将实际运行 NPM 并下载实际的软件包。如果我有一个单独的包文件,我 在我的每张图片中都会有很多膨胀,还有未使用的模块。

    你肯定会膨胀,这就是微服务的美妙之处,That's the curse of Microservice

    我应该有一个单独的 packages.json 吗?

    好的,让我试着具体解决这个问题。假设您的 moduleA 使用 lodash.x.x.x。并且您想在 moduleB 中使用 lodash.x+1.x.x。您确定 lodash.x+1.x.x 不向后兼容 lodash.x.x.x。所以,现在你不得不让 ModuleA 的代码与 lodash.x+1.x.x 兼容。如果上面所说的听起来是对的,我们将这些应用程序称为单体,而不是微服务。要回答您的问题,是的,您可能需要单独的 packages.json 除非您可以拥有具有公共依赖项的父 package.json 和具有自己的 package.json 的子模块(我不是来自节点领域,所以不确定是否 package.json json有这样的能力)

    我找不到有关我应该如何组织和部署的信息 我的代码。我应该有一个不同的节点项目(有单独的 packages.json)为我的每个模块?或者我应该有一个节点 我的所有模块的项目并单独部署每个模块?

    我已经看到了这两种模式(单独的项目以及同一项目中的子模块)。我个人的意见(就其价值而言)是拥有单独的项目和单独的代码库,因为您的“模块”已经在通过与语言无关的协议 AMQP 进行讨论。明天,你可能想为“ModuleB”(微服务B,取决于你如何看待它:))使用 golang/kotlin,谁知道呢。

    在我组织好我的项目后,是否有一个脚本工具可以 将我的每个模块生成(构建*并部署)到它自己的容器中?

    这里要澄清的一点是,一个微服务的开发和部署不应该强迫您更改/部署其他微服务,只要它们之间的合同保持不变,否则它是一个分布式单体(哇..我只是发明一个新术语?太棒了!!)。当合同发生变化时,您应该升级版本并让两个版本都运行一段时间,直到所有相关方(您的其他微服务)都有机会升级。

    【讨论】:

      【解决方案2】:

      你需要通过几个层。

      首先,您需要将每个微服务容器化到其自己的容器映像中。通常你会使用 Docker。

      每个应用程序都有一个单独的 Dockerfile,您将使用它来创建 docker 镜像,您将推送到 docker 镜像注册表,任何想要运行您的应用程序的人都可以拉取这些镜像。

      对于代码库组织,您可以拥有一个包含所有微服务的存储库,但您需要多个 Dockerfile 来为所有微服务创建映像。

      然后,您需要编排从图像创建的容器(运行它们)。如果您希望您的应用程序在一个主机上运行,​​您可以使用 Docker compose,它允许您在单个 yaml 清单文件中定义哪些容器以什么顺序运行。文档在这里:https://docs.docker.com/compose/

      如果您想在 kubernetes 集群中运行您的应用程序,您需要创建一个 k8s 部署 (https://kubernetes.io/docs/concepts/workloads/controllers/deployment/),它将您的容器作为集群节点上的 pod 运行。

      【讨论】:

      • 谢谢。我应该为每个 Dockerfile 有一个单独的 packages.json 吗?根据我的阅读,我了解 Dockerfile 将实际运行 NPM 并下载实际的包。如果我有一个单独的包文件,我的每个图像中都会有很多臃肿,并且有未使用的模块。
      • 通常您希望每个容器尽可能小。为每个应用程序拥有单独的 node_modules 目录似乎是一件明智的事情,您可以通过拥有单独的 package.json 文件来实现。这在语义上也很有意义,因为每个应用程序都是一个单独的“包”。
      猜你喜欢
      • 2017-01-02
      • 2020-10-12
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2018-10-30
      • 2019-11-19
      相关资源
      最近更新 更多