nginx-proxy用于多个节点应用程序泊坞窗

Abh*_*Adr 11 proxy node.js docker docker-compose

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

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

node.app1.com

node.app2.com

所以我使用了jwilder/nginx-proxy:latest,这些将位于这两个容器的fount中,并将充当反向代理.所以这是我的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
Run Code Online (Sandbox Code Playgroud)

./node-proxy/Dockerfile

FROM jwilder/nginx-proxy:latest
Run Code Online (Sandbox Code Playgroud)

./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);
Run Code Online (Sandbox Code Playgroud)

./app1/Dockerfile

FROM node:6.11
WORKDIR /app2
COPY app1.js .
CMD node app1.js
Expose 8085
Run Code Online (Sandbox Code Playgroud)

./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);
Run Code Online (Sandbox Code Playgroud)

./app2/Dockerfile

FROM node:6.11
WORKDIR /app2
COPY app2.js .
CMD node app2.js
Expose 8086
Run Code Online (Sandbox Code Playgroud)

所以,当我这样做

docker-compose up 
Run Code Online (Sandbox Code Playgroud)

我的所有容器都已启动并运行

在此输入图像描述

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

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

在此输入图像描述

我还检查了侧容器中的nginx.config

在此输入图像描述

docker exec -it node-proxy_id bash

cat /etc/nginx/conf.d/

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

谢谢你的时间

Jam*_*ang 1

当您设置linksdepends_on其他服务时,docker-compose 会container_name默认将其他服务主机名设置为同一 docker 网络中的主机名。

就你而言,我建议添加links@Mathias 回复。

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
Run Code Online (Sandbox Code Playgroud)

更新:

我注意到 Nginx 配置有upstream指令来保存多个主机名。您应该能够将其卷曲node-app1为:

$ curl -H 'Host: node.app1.com' localhost
Hello World 1
Run Code Online (Sandbox Code Playgroud)

etc/hosts您还可以将容器中文件的最后一行修改node-proxy为:

172.20.0.4 [docker-network-alias] node.app1.com node.app2.com
Run Code Online (Sandbox Code Playgroud)

然后你应该能够http://node.app1.com直接访问你的容器内部node-proxy

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

评论一:

根据我的理解,它nginx-proxy倾向于将请求代理到后端服务,而不必在/etc/hosts文件中注册主机名。因此,我们触发一个带有Hostheader 的请求,该 header 是 Nginxupstream块中的虚拟主机名。

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

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

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

nginx-proxy项目提供了一些模板设置,因此您可能能够获取应用程序容器的 IP 及其VIRTUAL_HOST环境,然后将其附加到/etc/hosts文件中。但通过这种方式,这将直接访问节点应用程序服务器,而不是来自代理nginx-proxy

如果不考虑生产级别,我建议将应用程序域附加到etc/hosts由 设定的文件的最后一行nginx-proxy,然后它应该按您的预期工作。nginx-proxy否则,需要从模板动态绑定主机名。