2017-10-15 105 views
3

这就是我如何使用nginx配置我的反向代理。有运行nodeJS应用程序的docker容器(app1,app2,...)Nginx反向代理:如何通过子域访问不同的容器?

通过这个我通过localhost:8080指向docker container app1 nodeJS应用程序并使用localhost:8081指向app2。

但我想通过子域调用应用程序而不使用端口,我不明白怎么做到这一点。我也觉得我搞砸了港口......

app1.localhost应指向app1app2.localhost应指向app2

nginx.conf

http { 
    sendfile on; 

    upstream docker-app1 { 
    server app1:80; 
    } 

    upstream docker-app2 { 
    server app2:80; 
    } 

    server { 
    listen 8080; 
    server_name app1.localhost; 
    location/{ 
     proxy_pass   http://docker-app1; 
     proxy_redirect  off; 
     proxy_buffering off; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Host $server_name; 
     #proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
    } 
    } 

    server { 
    listen 8081; 
    server_name app2.localhost; 
    location/{ 
     proxy_pass   http://docker-app2; 
     proxy_redirect  off; 
     proxy_buffering off; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Host $server_name; 
     #proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
    } 
    } 
} 

泊坞窗,compose.yml

version: '3.3' 
services: 
    nginx: 
    container_name: 'nginx' 
    image: 'nginx:1.13.5' 
    restart: 'always' 
    ports: 
     - '80:80' 
     - '8080:8080' 
     - '8081:8081' 
     - '443:443' 
    volumes: 
     - './nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro' 

    app1: 
    container_name: app1 
    build: ./app1 
    restart: always 
    ports: 
     - '3001:80' 

    app2: 
    container_name: app2 
    build: ./app1 
    restart: always 
    ports: 
     - '4200:80' 

更新:作为的Sergiu提供了良好的链接,反向代理,我更新了帖子与新组态;问题还是一样

+0

所以你想访问localhost:8081作为http://app.local? – Sergiu

+0

是否阻止了您使用端口80? – Sergiu

+0

我不确定你是否可以这样做,但你可以defo有http://app.local:8081如果没关系 – Sergiu

回答

0

而不是自定义的nginx的,使用jwilder/nginx-proxy应该是足够了:

version: '3.3' 
services: 
    nginx: 
    image: jwilder/nginx-proxy 
    ports: 
     - "80:80" 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 

    app1: 
    container_name: app1 
    build: ./app1 
    restart: always 
    environment: 
     VIRTUAL_HOST: app1.localhost 
    ports: 
     - 80 

    app2: 
    container_name: app2 
    build: ./app1 
    restart: always 
    environment: 
     VIRTUAL_HOST: app2.localhost 
    ports: 
     - 80 

然后把这个在您的机器/etc/host

127.0.0.1 app1.localhost 
127.0.0.1 app2.localhost 

使用,因为这:

curl -i app1.localhost 

jwilder/nginx-proxy将读取每个容器(通过docket API)的VIRTUAL_HOST环境变量,然后相应地设置其配置文件。

+0

我使用macOS,我不知道在哪里可以找到'docker.sock'' – user3142695

+0

感谢这个伟大的工作示例。只剩下一个问题 - 因为我不明白这一点的自述文件:我如何添加SSL支持?我在本地获得了一些自签名证书,我想切换到“https:// app1.localhost”。在我的高效服务器上,我将使用letsenrypt。 – user3142695

0

编译和运行不3.x版

努力为您创造节点应用的泊坞窗图像。

Dockerfile用于创建节点的应用程序的图像

Dockerfile

FROM node:boron 

# Create app directory 
WORKDIR /usr/src/app 

# Install app dependencies 
COPY package.json . 
# For [email protected] or later, copy package-lock.json as well 
# COPY package.json package-lock.json ./ 

RUN npm install 

# Bundle app source 
COPY . . 

EXPOSE 8080 
CMD [ "npm", "start" ] 

Replcae的EXPOSE端口相应

创建搬运工图像

搬运工建立-t APP1 。

docker build -t app2。

创建主机

须藤回声 “127.0.0.1 app1.localhost” >>/etc/hosts中

须藤回声 “127.0.0.1 app2.localhost” >> /等/承载

nginx.conf

user root; 

events { 
    worker_connections 1024; 
} 

http { 
    include   mime.types; 
    default_type  application/octet-stream; 
    sendfile   on; 
    tcp_nopush   on; 
    keepalive_timeout 65; 
    gzip    on; 
    gzip_types   text/plain text/css text/javascript 
         application/javascript application/json 
         application/xml; 
    index    index.html index.htm; 

    server { 
     listen 80; 
     server_name server_name app1.localhost;; 

     location/{ 
     proxy_pass http://172.31.42.174:8081/; 
     # Replace 172.31.42.174 with localhost if you are running reverse proxy in local server user private ip/public ip 
     # Add other properties as required 
     } 
    } 

    server { 
     listen 80; 
     server_name server_name app2.localhost;; 

     location/{ 
     proxy_pass http://172.31.42.174:8081/; 
       # Replace 172.31.42.174 with localhost if you are running reverse proxy in local server user private ip/public ip 
       # Add other properties as required 
     } 
    } 
} 

泊坞窗,compose.yml

version: '3' 
services: 
    nginx: 
     image: 'nginx:1.13.5' 

     ports: 
      - '80:80' 
     volumes: 
      - nginx-conf:/etc/nginx/nginx.conf:ro 
     deploy: 
      replicas: 1 
      update_config: 
       parallelism: 2 
       delay: 10s 
      restart_policy: 
       condition: on-failure 
      placement: 
       constraints: [node.role == manager] 

    app1: 
     image: app1 
     ports: 
      - 8081:8081 
     deploy: 
      replicas: 1 
      update_config: 
       parallelism: 2 
       delay: 10s 
      restart_policy: 
       condition: on-failure 
    app2: 
     image: app2 
     ports: 
      - 8081:8081 
     deploy: 
      replicas: 1 
      update_config: 
       parallelism: 2 
       delay: 10s 
      restart_policy: 
       condition: on-failure 

volumes: 
    nginx-conf: 
    driver: local 
    driver_opts: 
     o: bind 
     type: none 
     device: /path/of/nginx/conf/nginx.conf 

给nfginx.conf到卷的完整路径,如nginx的是的conf文件依赖,我们需要在主节点nginx的运行。

RUN

搬运工堆部署-c搬运工-撰写nodeapps

状态

搬运工堆LS

搬运工服务LS

+0

我不确定这个问题是否要求“码头堆栈”。我认为这是关于朴素码头撰写的,其中'build'完全合法。另外,从nginx配置文件指向'localhost'将不起作用,因为每个容器都有自己的'localhost'。 – Robert