0

当您拥有多个应用程序时,什么是好的设计?

所以基本上我已经对一个 react 应用程序和一个 nodejs 应用程序进行了 docker 化。所以我的想法是拥有 3 个 docker 容器 - 一个用于反应应用程序,一个用于 nodejs 后端和 nginx 作为路由器。任何调用/都将路由到反应应用程序,任何调用都/api将路由到 nodejs 后端。同样对于 react 应用程序,在开发期间我们将运行该应用程序,npm run start在部署时我们将有多个构建步骤,我们将在其中运行npm run build并将构建文件夹复制到 nginx 映像。我正在使用 docker compose 在我的本地 while dev 以及 QA/stage 服务器上运行这些。拥有 nginx 路由器的想法是允许代理从任何应用程序到不同的应用程序。通过这种方式,我想鼓励团队遵循精益架构。

为了帮助理解设计,请参阅以下内容:

开发环境 -

      -> "/" -> react app
      |
nginx |
      |
      -> "/api" -> nodejs 

产品环境 -

      -> "/" -> nginx (serving build folder)
      |
nginx |
      |
      -> "/api" -> nodejs 

这是一个好的设计吗?请分享您在自己的多应用程序 docker 设置中遵循的设计类型。

干杯!!!

4

2 回答 2

3

我建议为不同的环境按子域进行分区。因此,开发人员/测试人员在访问另一个环境时只需添加“dev”前缀。

                                     Docker
                                      | 
domain.com/*         -> |       | ->  |_Production UI
domain.com/api/*     -> |       | ->  |_Production Backend
                        | nginx |
dev.domain.com/*     -> |       | ->  |_Development UI
dev.domain.com/api/* -> |       | ->  |_Development Backend

这意味着拥有一个单一的 nginx 服务,即:

  1. 处理域映射和 url 路由
  2. 提供 SSL
  3. 可以负载平衡生产实例

您也可以选择将 nginx 网关放在 docker 中,但这不是必需的。

于 2019-03-05T07:28:01.190 回答
1

您的设计相当标准,尽管我个人会将 nginx 换成 traefik。Traefik 提供了相同的反向代理功能,但具有从您指定的源动态更新自身的优势。docker 用户最常见的来源是 docker API,用于检测容器何时启动/停止并带有要求在 traefik 上发布的标签。


如果您进入同一台机器上动态创建的环境(例如分支构建),并且与 traefik 对话的容器不应该互相对话(例如,多个 Web 服务也与同一环境中的其他 Web 服务对话),那么您可能想要更新到多层 traefik 设置。在全局级别,您有一个 traefik 安装路由请求到每个堆栈。环境(dev、QA、branch-x)的每个堆栈都有一个 traefik 容器,位于全局 traefik 网络和特定于堆栈的网络上。最终结果看起来有点像:

traefik-global (publish port 80/443, network=traefik)
|
+--> traefik-dev (traefik rule host=dev.xyz.com, network=traefik and default)
|    +--> react (traefik rule pathprefix=/, network=default)
|    +--> nodejs (traefik rule pathprefix=/api, network=default)
|
+--> traefik-qa (traefik rule host=qa.xyz.com, network=traefik and default)
|    +--> react (traefik rule pathprefix=/, network=default)
|    +--> nodejs (traefik rule pathprefix=/api, network=default)
...

在上述设计中,react 可以在内部指向 nodejs,并且只会与同一网络中的容器对话,而不会跨越 dev/qa 边界。将有一个预先创建的外部网络 traefik。您需要使用 traefik 标签来限制哪些容器由哪个 traefik 实例管理。在上述架构中将部署 3 个堆栈,一个 traefik-global,一个 traefik-dev + 应用程序,第三个 traefik-qa + 应用程序。然后您只需根据需要添加更多堆栈。

于 2019-03-07T13:31:46.900 回答