我试图确定是否最好将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/