Docker Nginx代理:如何使用路径而不是主机名将流量路由到不同的容器

时间:2016-09-15 14:57:22

标签: nginx docker proxy

我们可以说现在我在不同路径上的同一台服务器上运行了不同的应用程序:

  • 10.200.200.210/ app1
  • 10.200.200.210/的 APP2
  • 10.200.200.210/的 APP3

我想使用nginx作为代理在不同的Docker容器上运行每个应用程序。

我尝试了jwilder/nginx-proxy并且如果我使用不同的域名(app1.domain.com,app2.domain.com等),效果很好,但是我无法使用域名,我需要使用相同的IP。

我也不能使用不同的端口,如:

  • 10.200.200.210:81/的 APP1
  • 10.200.200.210:82/的 APP2
  • 10.200.200.210:83/的 APP3

所有必须在端口80上工作。

  1. 有一种方法可以配置 jwilder / nginx-proxy 来执行此操作吗?
  2. 还有另一个像 jwilder / nginx-proxy 这样的Docker镜像。
  3. 或者你能给我一些暗示自己建立一个nginx docker容器吗?

5 个答案:

答案 0 :(得分:4)

如果有人仍在寻找答案。 通过jwilder / nginx-proxy,您可以基于代理范围或按VIRTUAL_HOST使用自定义Nginx配置。

在这里,如何通过Per-VIRTUAL_HOST位置配置来做到这一点。

  1. 在您的poject文件夹内创建另一个文件夹-“ vhost.d”。
  2. 使用“ vhost.d”文件夹中的自定义nginx配置创建文件“ whoami.local”。 此文件的名称必须与VIRTUAL_HOST相同!

./ vhost.d / whoami.local

location /app1 {
  proxy_pass http://app1:8000;
}

location /app2 {
  proxy_pass http://app2:8000;
}
  1. 创建docker-compose.yml文件。

./ docker-compose.yml

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
    - "8080:80"
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /path/to/vhost.d:/etc/nginx/vhost.d:ro

  gateway:
    image: jwilder/whoami
    environment:
    - VIRTUAL_HOST=whoami.local

  app1:
    image: jwilder/whoami

  app2:
    image: jwilder/whoami
  1. 运行docker-compose up
  2. 检查配置

在bash中运行:

$ curl -H "Host: whoami.local" localhost:8080
I'm 1ae273bce7a4
$ curl -H "Host: whoami.local" localhost:8080/app1
I'm 52b1a7b1992a
$ curl -H "Host: whoami.local" localhost:8080/app2
I'm 4adbd3f9e7a0
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                  NAMES
6a659a4d4b0a        jwilder/nginx-proxy   "/app/docker-entrypo…"   54 seconds ago      Up 53 seconds       0.0.0.0:8080->80/tcp   nginxreverseproxy_nginx-proxy_1
4adbd3f9e7a0        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app2_1
52b1a7b1992a        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app1_1
1ae273bce7a4        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_gateway_1

您还可以在/ etc / hosts文件中添加“ whoami.local”域,然后直接调用该域。

/ etc / hosts

...
127.0.0.1   whoami.local
...

结果:

$ curl whoami.local:8080
I'm 52ed6da1e86c
$ curl whoami.local:8080/app1
I'm 4116f51020da
$ curl whoami.local:8080/app2
I'm c4db24012582

答案 1 :(得分:1)

这里是完整的std::vector<Car>::iterator it; it = std::search(carVector.begin(), carVector.end(), std::begin(carArray), std::end(carArray)); if (it != carVector.end()) { // carArray was found in carVector, do sth here with it std::cout << it->GetBrand(); }

它将全部重定向到root,仅将nginx.conf重定向到其他容器。

Source and an example container using it

/api

答案 2 :(得分:0)

只需使用nginx图片创建容器,**请记住set net&#34; host&#34; **这将使您的容器与主机machine.mount nginx.conf文件和配置代理表共享相同的地址和端口。例如:

docker命令:

docker run --name http-proxy -v /host/nginx.conf:/etc/nginx/nginx.conf --net host -itd --restart always nginx

nginx.conf:

server {
  listen 80;
  location /app1 {
    proxy_pass YOUR_APP1_URL;
  }
  location /app2 {
    proxy_pass YOUR_APP2_URL;
  }
}

答案 3 :(得分:0)

只需将其放入/etc/nginx/nginx.conf

    worker_processes  1;

    error_log  /var/log/nginx/error.log;

    events {
        worker_connections  1024;
    }


    http {
      server {
            listen 80;

            location /api {
                proxy_pass http://awesome-api;
                proxy_redirect     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;
            }
      }
    }

答案 4 :(得分:0)

默认网桥网络在172.17.0.1上具有网关。您可以在nginx.conf

中使用此IP地址
server {
    listen 80;
    server_name example.com;

    location /app1 {
        proxy_pass  http://172.17.0.1:81;
    }
    location /app2 {
        proxy_pass  http://172.17.0.1:82;
    }
}

可以从外部使用端口80来访问它们

您可以通过运行命令docker network inspect bridge

检查网桥网关的IP地址。