简体   繁体   中英

Nginx reverse proxy: How to get access to different container via subdomains?

This is how I configured my reverse proxy using nginx. There are docker container with nodeJS applications running (app1, app2, ...)

With this I point via localhost:8080 to the docker container app1 nodeJS application and with localhost:8081 to app2.

But I want to call the apps via subdomains without using the ports and I don't see how do get this. I also think I messed up the ports...

app1.localhost should point to app1 and app2.localhost should point to 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;
    }
  }
}

docker-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'

Update: As Sergiu provided a good link for reverse proxy, I updated the post with the new configuration; the question is still the same

Instead of a custom nginx, using jwilder/nginx-proxy should be sufficient:

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

Then put this in the /etc/host of your machine:

127.0.0.1 app1.localhost
127.0.0.1 app2.localhost

Use as this:

curl -i app1.localhost

jwilder/nginx-proxy will do the magic reading the VIRTUAL_HOST environment variable from each container (through the docket API), and then set up its config files accordingly.

Build and run doesn't work in version 3.x

create the docker images for your node applications.

Dockerfile for creating the images of node application

Dockerfile

FROM node:boron

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json .
# For npm@5 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 the EXPOSE port accordingly

create the docker images

docker build -t app1 .

docker build -t app2 .

Create the hosts

sudo echo "127.0.0.1 app1.localhost" >> /etc/hosts

sudo echo "127.0.0.1 app2.localhost" >> /etc/hosts

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
      }
    }  
}

docker-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

give full path of the nfginx.conf to the volume, as nginx is conf file dependent we need to run nginx at master node.

RUN

docker stack deploy -c docker-compose nodeapps

Status

docker stack ls

docker service ls

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM