2017-04-18 109 views
0

我用这LIB:如何改变nginx的代理设置

https://github.com/jwilder/nginx-proxy

这里是我的搬运工,撰写文件:

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.4 
    build: . 
    volumes: 
     - .:/app 
    restart: always 
    environment: 
     - VIRTUAL_HOST=service1.local 
    service2: 
    image: mynodeother:1.3 
    build: . 
    volumes: 
     - .:/app 
    restart: always 
    environment: 
     - VIRTUAL_HOST=service2.local 

我加了2个新的节点服务...

我可以这样做:curl -H "Host: service2.local" localhost并从service2获得响应....

问题是我从中得到什么好处?我怎样才能在80端口上运行service1?

这里是Dockerfile从服务1:

FROM node:6.9.4 

# Create app directory 
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

RUN npm install nodemon -g 

# Install app dependencies 
COPY package.json /usr/src/app/ 
RUN npm install 

# Bundle app source 
COPY . /usr/src/app 

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

回答

0

这很容易,你只需要在80端口运行的所有服务,并公开您Dockerfile该端口,仅此而已。

只要你不发布那个端口给你的主机(就像你用nginx做的那样),没有问题。

这样做的好处是,您在那里的每项服务都可以通过使用主机名到达另一个服务器,这意味着该容器的名称,这很酷,因为您不需要知道分配给每个容器的当前IP地址。

所以,如果你去到这些服务之一,bashsh你应该能够通过使用主机名ping其他服务:

内部服务1: ping service2

好事约nginx-proxy是这是怎么回事,如果你扩展你的服务的一个检测,它会自动更新,nginx的配置:

docker-compose scale service1=3

我将启动其他2个service1实例,无论您有100个,其余的服务都可以通过使用hostname:service1来访问它们。

因此,您可以平衡负载,无需担心同一服务的每个实例的IP地址。

+0

如果我像这样登录容器:'docker run -it mynode:1.0/bin/bash'并尝试从某种原因ping其他容器我得到'ping:unknown host'你知道什么是问题吗? – Vladimir

+0

尝试使用服务的名称和VIRTUAL_HOST。如果他们在同一个网络,它应该工作。 另外请确保您拥有最新的Docker版本,其中嵌入式DNS服务器已实施。 – calbertts

+0

它的工作原理时,我使用http req从antoher服务调用服务,但现在当像上面那样手动执行时...另外,如何解决路由问题,例如,如果我有2个不同路由的服务,可以绑定路由自动同一主机? – Vladimir