2017-03-08 4 views
0

도커 컨테이너로 webapp을 구축하려고하는데 노드 패키지에 역방향 프록시로 Nginx를 실행하려고하면 연결이 거부됩니다. 그것은 nginx 서버 구성 문제 또는 도커 - 구성 문제를 구성하는 경우 잘 모르겠습니다. foo.com을 타격 할 때Nginx 연결이 거부되었습니다. 역방향 프록시로 노드 앱에 연결하려고 시도했습니다.

[error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.20.0.1, server: foo.com, request: "GET/HTTP/1.1", upstream: "http://127.0.0.1:7770/", host: "foo.com" 

내가이 오류, 이상한 점은 포트 번호를 참조 할 때 내 응용 프로그램이 작동하므로 foo.com:7770이 응용 프로그램을 실행하는 것입니다.

내의 nginx 서버 설정 :

server { 
    listen  80; 
    server_name foo.com; 

    port_in_redirect off; 
    autoindex on; 

    location/{ 
     proxy_pass http://127.0.0.1:7770; 
     proxy_redirect off; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 
} 

내 도커 파일을 작성 :

version: "2" 
services: 
    nginx: 
    build: ./nginx 
    ports: 
     - "80:80" 
    depends_on: 
     - app 
    links: 
     - app 
    app: 
    build: 
     context: . 
     dockerfile: DockerFile 
    ports: 
     - "7770:7770" 
    links: 
     - mongo 
    depends_on: 
     - mongo 
    mongo: 
    image: mongo 
    ports: 
     - "27017:27017" 
    volumes_from: 
     - mongodata 
    depends_on: 
     - mongodata 
    mongodata: 
    image: tianon/true 
    volumes: 
     - /data/db 

내 노드 Dockerfile (여기에 일부 중복 가지가있을 수 있습니다) :

FROM node:latest 

ADD package.json /tmp/package.json 
RUN cd /tmp && npm install 
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/ 

WORKDIR /opt/app 
ADD . /opt/app 

EXPOSE 7770 

CMD ["npm", "start"] 

내 ngnix Dockerfile

0 NPM에 1,235,411,968,

이 실행할 시작 :

app.get('*', function(req, res) { 
    res.sendFile(path.join(__dirname, 'index.html')); 
}); 

app.listen(7770, function(err) { 
    if (err) { 
    console.log(err); 
    return; 
    } 

    console.log('Listening at http://localhost:7770'); 
}); 

이 고정 표시기에서 처음 실행, 그래서 내가 몇 가지를 뒤죽박죽 수 있습니다. 또한 foo.com을/private/etc/hosts에서 127.0.0.1로 지정했습니다.

답변

2

C-홈즈, 모든

먼저, 각 컨테이너가 자신의 네트워크 스택을 가지고 기억해야합니다, 그래서 당신은 고정 표시기 호스트에서 실행되는 서비스에 도달하기 위해 컨테이너 내부 localhost을 사용할 수 없습니다.

이 특정 프로젝트의 경우 Nginx 서버 구성의 proxy_pass 지시문을 app 컨테이너에 도달하는 값으로 지정해야합니다. 뭔가 같이 :

proxy_pass http://app:7770;

당신 때문에 docker-compose 맥락에서 컨테이너 이름이 내부 DNS 항목에 매핑 될 권리를 수행해야합니다. 이를 통해 7770 개의 앱 컨테이너를 외부에 게시 할 필요가 없으며 MongoBD에 앱 컨테이너 만 액세스 할 수있는 경우 27017 포트를 게시 할 필요가 없습니다.

0

nginx에서 app으로 트래픽을 라우팅하려면 proxy_passapp 컨테이너의 IP 주소 또는 DNS를 사용해야합니다. 도커 작성 서비스는 서비스 이름으로 서로를 발견, 지금의 nginx의 conf에서 변경할 수 있습니다으로

proxy_pass http://app:7770;

당신은 외부 세계에 포트 7770을 게시 할 필요가 없습니다. 또한 mongo의 경우 27017 포트를 게시 할 필요가 없습니다.