【问题标题】:Nginx reverse proxy: How to get access to different container via subdomains?Nginx 反向代理:如何通过子域访问不同的容器?
【发布时间】:2018-03-27 04:49:44
【问题描述】:

这就是我使用 nginx 配置反向代理的方式。有运行 nodeJS 应用程序的 docker 容器(app1,app2,...)

我通过 localhost:8080 指向 docker 容器 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;
    }
  }
}

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'

更新:由于 Sergiu 提供了一个很好的反向代理链接,我用新的配置更新了帖子;问题还是一样

【问题讨论】:

  • 所以你想以app.local 的身份访问localhost:8081?
  • 有什么东西阻止你使用 80 端口吗?
  • 我不确定你是否可以这样做,但如果可以的话,你可以使用app.local:8081
  • 您在 nginx 配置中缺少应用程序...我无法看到您在 nginx default.conf 中指向应用程序目录的任何地方
  • 我不知道该怎么做。我只有运行应用程序的 docker-compose 文件。但是,它根本无法访问。你是对的,缺少 nginx 配置。这是我的问题,因为我没有正确理解。

标签: node.js docker nginx docker-compose


【解决方案1】:

使用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 环境变量,然后相应地设置其配置文件。

【讨论】:

  • 我正在使用 macOS,但我不知道在哪里可以找到`docker.sock`
  • 感谢这个出色的工作示例。只剩下一个问题 - 因为我不明白这一点的自述文件:如何添加 SSL 支持?我在本地获得了一些自签名证书,我想切换到https://app1.localhost。在我的生产服务器上,我将使用letsenrypt。
  • 在同一台服务器上部署 2 个子域的非常酷的方法
【解决方案2】:

构建和运行在 3.x 版本中不起作用

为您的节点应用程序创建 docker 映像。

创建节点应用镜像的Dockerfile

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" ]

相应地复制 EXPOSE 端口

创建 docker 镜像

docker build -t app1 .

docker build -t app2 .

创建主机

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

给出卷的 nfginx.conf 的完整路径,因为 nginx 依赖于 conf 文件,我们需要在主节点上运行 nginx。

运行

docker stack deploy -c docker-compose nodeapps

状态

码头工人栈 ls

docker 服务 ls

【讨论】:

  • 我不确定问题是否要求docker stack。我认为这是关于普通的 docker-compose,其中build 是完全合法的。此外,从 nginx 配置指向 localhost 将不起作用,因为每个容器都有自己的 localhost
猜你喜欢
  • 2020-02-26
  • 2021-12-21
  • 1970-01-01
  • 2017-11-13
  • 2021-12-18
  • 2020-01-19
  • 1970-01-01
  • 2020-04-19
  • 2017-09-25
相关资源
最近更新 更多