多个docker服务可以在同一主机和端口上侦听

时间:2017-04-19 10:23:58

标签: nginx docker docker-compose microservices jwilder-nginx-proxy

我是nginx的新手,我不确定这是正常行为......

这是我正在使用的lib:https://github.com/jwilder/nginx-proxy

我将在这里解释我想要完成的事情......

我有2个额外服务service1service2这些服务是带有API端点的简单node.js图像

service1 have routes:
- service1/api/first
- service1/api/second
`

`
service2 have routes:
- service2/api/third
- service2/api/fourth
`

So is possible to be able to access this services from same host, like this:
localhost/service1/api/first
localhost/service2/api/third
?

I tried like this:

My `docker-compose.yml` file:


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

  whoami:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=whoami.local
  service1:
    image: mynode:1.1
    volumes:
        - .:/app
    restart: always
    environment:
      - VIRTUAL_HOST=service1.local
      - VIRTUAL_PORT=8080
  service2:
    image: mynodeother:1.2
    volumes:
        - .:/app
    restart: always
    environment:
      - VIRTUAL_HOST=service2.local
      - VIRTUAL_PORT=8081

这是从命令docker exec nginx-proxy cat /etc/nginx/conf.d/default.conf生成的配置文件: http://pushsc.com/show/code/58f739790a58d602a0b99d22

当我在浏览器中访问localhost时,我得到:

  

欢迎来到nginx!

     

如果您看到此页面,则表示已成功安装nginx Web服务器   和工作。需要进一步配置。

     

有关在线文档和支持,请参阅nginx.org。   nginx.com提供商业支持。

     

感谢您使用nginx。

1 个答案:

答案 0 :(得分:1)

尽量不要在nginx配置文件中使用IP地址。 此外,您应该为两个服务使用相同的端口号:8080(如果这是nodejs应用程序正在侦听的端口)。

然后,您应该在每个location上下文中使用server正确定义到每项服务的路由。

因此,您应该修改/etc/nginx/conf.d/default.conf容器内的nginx,如下所示:

# service1.local
upstream service1.local {
            ## Can be connect with "nginxproxy_default" network
            # nginxproxy_service1_1
            server service1:8080;
}

server {
    server_name service1.local;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location /service1 { #note this line
        proxy_pass http://service1.local;
    }
}

# service2.local
upstream service2.local {
            ## Can be connect with "nginxproxy_default" network
            # nginxproxy_service2_1
            server service2:8080; #same port
}

server {
    server_name service2.local;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location /service2 { #note this line
        proxy_pass http://service2.local;
    }
}