2016-08-19 3 views
4

Я нахожусь на первом этапе обучения использованию докеров, поэтому я пробую основные вещи. Я создал два сервиса Node Express, которым необходимо обмениваться данными через HTTP-запросы.Докеры HTTP-запросы между контейнерами

Мой docker-compose.yml файл

networks: 
    isolation-network: 
    driver: bridge 

services: 
    service1-nodejs: 
    build: 
    context: ./service1/ 
    dockerfile: .docker/node.dockerfile 
    ports: 
     - "10000:9000" 
     - "10001:5858" 
    env_file: ./service1/.docker/env/app.${APP_ENV}.env 
    networks: 
     - isolation-network 

    service2-nodejs: 
    build: 
    context: ./service2/ 
    dockerfile: .docker/node.dockerfile 
    ports: 
     - "10010:9000" 
     - "10011:5858" 
    env_file: ./service2/.docker/env/app.${APP_ENV}.env 
    networks: 
     - isolation-network 

service1 использует request module сделать POST-запрос на service 2.

request({ url: "http//service2:10010/api/", 
       method: "POST", 
       headers: { "Content-Type": "application/json" }, 
       json: true, 
       body: { ... }, 
       time: true 
      }, function (err, res, body) { 
       if (!err && res.statusCode == 200) { 
        // success 
       } 

       // failed 
      }); 

В результате этого вызова:

{ Error: connect ECONNREFUSED 172.18.0.3:10010}

Использование почтальона я могу проверить service2 на http://localhost:10010/api/ и я могу подтвердить, что они на самом деле могут быть достигнуты и работать, как ожидалось.

Мне ничего не хватает, но я не могу понять это. Что здесь происходит?

ответ

8

See the document. Порт 10010 - это порт хоста, но не контейнерный порт. Вы должны использовать 9000 при прямом доступе к контейнеру service2.

Так что просто измените "http://service2:10010/api/" на "http://service2:9000/api/", и он будет работать.

+0

+ вам нужно связать контейнер с другим –

+0

@JohannesMerz Он использует сети, и он получил разрешение «service2» как «172.18.0.3». –

+1

Я использую сети, поэтому связывание не должно быть необходимым, если использовать внутренний порт контейнера, который разрешил мою проблему. – Gavello