nginx代理多个节点的应用程序泊坞窗

我正在尝试nginx反向代理多个容器。

我有2个容器,有节点添加一个听8085和其他8086我希望他们访问

node.app1.com

node.app2.com

所以我用jwilder / nginx代理:最新将坐在这两个容器的来源,将作为反向代理。 所以这里是我的compose.yml文件。


泊坞窗,compose.yml

version: "3" services: node-proxy: build: ./node-proxy container_name : node-proxy restart : always volumes: - /var/run/docker.sock:/tmp/docker.sock:ro ports: - 80:80 - 443:443 node-app1: build: ./app1 container_name : node-app1 restart: always environment: VIRTUAL_HOST: node.app1.com depends_on: - node-proxy node-app2: build: ./app2 container_name : node-app2 restart: always environment: VIRTUAL_HOST: node.app2.com depends_on: - node-proxy 

./node-proxy/Dockerfile

 FROM jwilder/nginx-proxy:latest 

./app1/app1.js

 var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World 1\n'); }).listen(8085); 

./app1/Dockerfile

 FROM node:6.11 WORKDIR /app2 COPY app1.js . CMD node app1.js Expose 8085 

./app2/app2.js

 var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World 2\n'); }).listen(8086); 

./app2/Dockerfile

 FROM node:6.11 WORKDIR /app2 COPY app2.js . CMD node app2.js Expose 8086 

所以当我这样做

 docker-compose up 

我所有的容器都在运行

在这里输入图像描述

但什么时候做node.app1.com – >它说的是未知的主机。

所以要检查它的请求来代理我尝试从浏览器调用http:// localhost它说503

在这里输入图像描述

我也检查nginx.config侧容器

在这里输入图像描述

docker exec -it node-proxy_id bash

cat /etc/nginx/conf.d/

它在那里,但我认为当我做node.app1.com请求不来代理。 我没有得到我错过的地方,有人能帮我解决这个问题。

谢谢你的时间

当您将linksdepends_on设置为其他服务时,默认情况下, depends_on -compose将在同一个泊坞窗networking中将其他服务主机名设置为其container_name

在你的情况下,我会build议添加@Mathias响应的links

 version: "3" services: node-app1: build: ./app1 container_name : node-app1 restart: always expose: - "8085" environment: VIRTUAL_HOST: node.app1.com node-app2: build: ./app2 container_name : node-app2 restart: always expose: - "8086" environment: VIRTUAL_HOST: node.app2.com node-proxy: build: ./node-proxy container_name : node-proxy restart : always links: - node-app1 - node-app2 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro ports: - 80:80 - 443:443 

更新:

我注意到Nginxconfiguration有upstream指令来保存多个主机名。 你应该能够将node-app1curl为:

 $ curl -H 'Host: node.app1.com' localhost Hello World 1 

您还可以修改node-proxy容器中的etc/hosts文件的最后一行,如下所示:

 172.20.0.4 [docker-network-alias] node.app1.com node.app2.com 

那么你应该可以直接在你的node-proxy容器中访问http://node.app1.com

这里是一个在ubuntu 16 04上设置nginx虚拟主机的教程

评论I:

在我的理解中, nginx-proxy倾向于将请求代理到后端服务,而不必在/etc/hosts文件中注册主机名。 所以我们用Nginx upstream模块中的虚拟主机名Host标头来发起请求。

在每个应用程序容器设置中创build环境variablesVIRTUAL_HOST时, nginx-proxy已经为您完成了这一部分。 但这并不意味着我们可以直接访问我们浏览器中的node.app1.com ,并期望这个请求将被代理并由node-app1容器响应。

返回请求转发部分,请求到达端口80/443的localhost ,由Nginx监听。 然后Nginx检查Host头进入特定的位置块。 这就是为什么你不能在你的浏览器中直接访问http://node.app1.com ,因为这个主机名永远不会真的在etc/hosts注册,所以它将永远不会被任何服务器,应用程序或者我们的nginx-proxy

如果我们想通过浏览器访问这个主机名,需要额外的etc/hosts设置。

nginx-proxy项目提供了一些模板设置,所以你可以获得应用程序容器的IP地址和VIRTUAL_HOST环境,然后将其附加到/etc/hosts文件。 但是通过这种方式,这将直接访问节点应用服务器,而不是来自nginx-proxy

如果没有生产级别的关注,我会build议在nginx-proxy设置的最后一行的etc/hosts文件中追加应用程序域名,那么它应该像你期望的那样工作。 否则,需要从nginx-proxy模板进行主机名dynamic绑定的工作。

看看你的应用程序/ Dockerfile的端口:

./app1/app1.js

})听(8085);

./app1/Dockerfile

公开8086

他们是错配的。


我丢失的部分是jwilder/nginx-proxy反映了jwilder/nginx-proxy寻找需要被代理的容器。

原文:

我想你的问题是反向代理容器无法到达每个应用程序。 depends_on从node-app1和node-app2中删除depends_on并添加到node-proxy中:

 links: - node-app1 - node-app2 

反向代理需要启动两个应用程序,而不是相反。 也使用links而不是depends_on

从文档 :

依赖于取决于

表示服务之间的依赖关系,这有两个作用:

  • docker-compose up将以依赖性顺序启动服务。 在下面的例子中,db和redis将在web之前启动。

  • docker-up up SERVICE将自动包含SERVICE的依赖关系。 在下面的例子中,docker-up up web也会创build并启动db和redis。

链接

链接服务的容器将可以在与别名相同的主机名上访问,如果没有指定别名,则可以访问服务名称。

链接也以与depends_on相同的方式表示服务之间的依赖关系,因此它们确定服务启动的顺序。

我也不知道你的代理configuration如何到达这个容器的IP地址。 您可以使用(如文档中所述)替代别名或服务名称。 (在你的情况下node-app1和node-app2)