【问题标题】:Docker design for multiple apps [closed]多个应用程序的 Docker 设计[关闭]
【发布时间】:2019-07-26 13:37:46
【问题描述】:

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

所以基本上我已经将一个 react 应用程序和一个 nodejs 应用程序 docker 化了。所以我的想法是拥有 3 个 docker 容器 - 一个用于反应应用程序,一个用于 nodejs 后端和 nginx 作为路由器。带有/ 的任何调用都将路由到react 应用程序,带有/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 设置中遵循的设计类型。

干杯!!!

【问题讨论】:

    标签: node.js reactjs docker docker-compose application-design


    【解决方案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 + 应用程序。然后您只需根据需要添加更多堆栈。

    【讨论】:

      【解决方案2】:

      我建议为不同的环境按子域进行分区。因此,开发人员/测试人员在访问另一个环境时只需添加“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 中,但这不是必需的。

      【讨论】:

      • 您能详细说明一下吗?我没有完全理解这一点。
      • @bhb 关键是你可以有一个单一的 nginx 网关,设置一次并路由到相同/不同机器上的 Docker 容器。
      • 啊是的...有道理...酷
      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2012-06-30
      • 2011-07-03
      • 2011-09-30
      • 2017-08-11
      • 2010-09-07
      • 2011-03-13
      相关资源
      最近更新 更多