node.js - 将Nginx作为其自己的容器运行,与客户端应用程序容器分开运行

标签 node.js reactjs docker nginx

我试图确定是否最好将nginx作为其自己的容器运行,而不在其上包含客户端应用程序。然后运行另一个容器作为客户端应用程序。第三个将是提供后端API的容器
我发现尝试将nginx与客户端文件在Dockerfile或同一nginx容器实例中的代码结合起来不是很干净。您最终不得不在Docker中使用多重构建或以其他方式首先对客户端应用程序进行Docker化,然后再对其运行nginx。因此,考虑将其分成两个单独的容器以保持其清洁。
因此,我将获得3个Dockerfile,然后使用Docker compose运行它们:

nginx.Dockerfile (Will use the nginx image from dockerhub.  Is it possible to tell nginx.conf to point to index.html of my client container via localhost resolution somehow and not look in `/usr/share/nginx/html`?)
client.Dockerfile (ReactJS front-end, dist code from webpack)
backend.Dockerfile (server - RESTful or GraphQL Data API)
目标:
我希望而不是 nginx容器中混合/保存我的客户端应用代码。我想将其与nginx容器分离...这就是为什么我要在这里使用3个容器来保持彼此分离的原因。我知道nginx.conf将需要找到index.html在我的客户端应用程序中的位置,但是我想不在同一容器中这样做。
换句话说,我想知道是否有一种方法可以通过nginx.config告诉localhost而不是说index.html端口来找到80,这是我单独的客户端容器将要从中暴露该文件的端口。因此,除了让Nginx在index.html(具有客户端应用程序代码的相同容器)中找到/usr/share/nginx/html之外,我还可以告诉它浏览来自客户端应用程序容器的localhost:80吗?我希望我的nginx容器独立于客户端代码运行。还是这完全不可能,我必须将我的客户端应用程序代码复制到/usr/share/nginx/html中,这是唯一的方法,它们必须以相同的方式生活在一起,而我的脱钩梦想没有任何意义?
我的客户端应用仍将具有expressJS服务器,但仅用于提供静态 Assets 。我的后端将是另一个用于将数据备份到客户端的快速API。

最佳答案

假设运行额外的Web服务器不会打扰您,则此设置很好。我可能还会基于Nginx构建“客户端”镜像,但是它唯一要做的就是从Webpack构建的dist目录中提供静态内容(因此这将是一个多阶段构建,而最后一个阶段则不会包括Node或任何构建工具)。
在“nginx”容器中,您将使用proxy_pass指令根据URL匹配将请求转发到一个或另一个容器。

location = / {
  return /ui/                  # 302 redirect
}
location /ui/ {
  proxy_pass http://client/    # host name matches a Compose service
}
location /api/ {
  proxy_pass http://backend/   # host name matches a Compose service
}
对此的进一步推论是,您实际上不需要在Docker中托管“客户端”代码。 Webpack生成一堆静态文件,并且可以配置为它们赋予唯一的名称。如果您拥有某种非Docker文件服务(Amazon S3将在此处使用),则可以将Webpack构建的结果上传到该服务,然后以与此处相同的方式proxy_pass或重定向到UI。
(如果您使用基于Nginx的入口 Controller 在Kubernetes中运行此应用程序,它将具有您所描述的布局,并且完全是常规的。)

关于node.js - 将Nginx作为其自己的容器运行,与客户端应用程序容器分开运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63878089/

相关文章:

bash - 来自Alpine的Docker phpunit:3.7输入shell CLI sh或bash

javascript - 将路由器与 Express 和 Node.js 结合使用

javascript - 在 reducer 中使用 Date.now() 替换

nginx - Proxy_pass 从 foo.website.com 到 localhost :xxxx using nginx on docker - not localhost on physical machine

javascript - Spreaded Array 上的意外结果拼接

react-router - 使用 React Router 进行转换/重定向的真正正确方法是什么?

spring - 如何使用 spring cloud config server 和 spring cloud bus 和 rabbit mq 更新配置?

javascript - 在nodejs中将excel文件转换为json

javascript - 如何找到 Google 云端硬盘文件的整个父文件夹层次结构?

Node.js 使用多个回调的正确方法