Как подключить мое приложение nodeApp к другому приложению NodeApp, работающему в Docker?

#docker #nodes

#docker #узлы

Вопрос:

У меня есть два контейнера NodeJS, которые я хотел бы подключить.

первый работает как API, который возвращает файл json,

 var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// Form data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}))

// set port port=4444 node app.js
var port = process.env.PORT || 3001;

//ROUTES FOR API
//get the router instance from express
var router = express.Router();

//test route on accessed at GET http://localhost:8080/api
router.get('/', function(req, res) {
  res.json({message:'hello Welcome to our api'});
});

//all of our routes will be prfixed with /api
app.use('/api', router);

// server start
app.listen(port);
console.log('The server is running on localhost:'   port);
  

и второй (мой веб-сервис) делает запрос к этому API, чтобы позже создать метод GET POST.

 var http = require("http");
var request = require('request');
var express = require('express');
var app = express();



    request({ url: "nodeapi:/loving_mccarthy:3001/api",
                    method: "GET",
                    headers: { "Content-Type": "application/json" },
                    json: true,

                }, function (error, response, body) {
                  if(error) {
                    console.log(error);
                  } else {
                    console.log(response.statusCode);
                    console.log('the api contents: n'   body.message);
                  }
                  });
  

У меня уже есть второй контейнер, связанный с первым so ( docker run -d --link nodeapi:nodeapi -v /vagrant_workspace/nodejs_test/src:/usr/src/app/src eddy/node_test:v3 ) .

но я не знаю, как я могу написать код во втором, чтобы URL-адрес и аргумент, исходящие из первого контейнера, вызывались во втором.

Ответ №1:

Ссылки — это устаревшая функция — предпочтительный способ сделать это сейчас — с помощью Docker networks.

Сначала вы создаете сеть, и когда вы запускаете контейнеры в той же сети, они могут обращаться друг к другу через DNS, используя имя контейнера:

 > docker network create my-app
aeb906ae13daf10331fefa026621fd11d9e6a8112757308cda82ad969a1cea6b    

> docker run -d --name api --network my-app nginx:alpine
68ed7384891fcc6563d6dfe740fb2f09f058b308c333c73b47f511b2fed5cf6f

> docker run -d --name web --network my-app nginx:alpine
eecbefd788383553d4fb1429ef207b5b83d57165ce39db0d100da318dadef541  
  

Простой пример с ping :

 > docker exec web ping -c 1 api
PING api (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.091 ms                                                                                                        

> docker exec api ping -c 1 web
PING web (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.107 ms
  

В вашем коде вы ссылаетесь на службы по их DNS-имени (например, web, api, db) и позволяете Docker обрабатывать обнаружение.

Ответ №2:

привет, Элтон, и сначала спасибо за ответ, но, когда я пытаюсь работать с docker network, это не работает, я становлюсь таким:

 $ docker network
docker: 'network' is not a docker command. See 'docker --help'.
  

Однако я тоже могу пинговать контейнер nodeapi из Интернета:

 root@fbfd0f8fa01d:/usr/src/app/src# ping nodeapi
PING nodeapi (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: icmp_seq=0 ttl=64 time=0.283 ms
  

но если попытаться выполнить запрос к api узла внутри web, например:

 request({ url: "nodeapi:/<web_container_name>:3001/api",
                    method: "GET",
                    headers: { "Content-Type": "application/json" },
                    json: true,

                }, function (error, response, body) {
                  if(error) {
                    console.log(error);
                  } else {
                    console.log(response.statusCode);
                    console.log('the api contents: n'   body.message);
                  }
                  });
  

или как:

 request({ url: "http://172.17.0.1:3001/api",
                    method: "GET",
                    headers: { "Content-Type": "application/json" },
                    json: true,

                }, function (error, response, body) {
                  if(error) {
                    console.log(error);
                  } else {
                    console.log(response.statusCode);
                    console.log('the api contents: n'   body.message);
                  }
                  });
  

Запрос не работает.

Далее вы можете увидеть окружение контейнера

 root@fbfd0f8fa01d:/usr/src/app/src# env | grep NODEAPI
NODEAPI_PORT_3001_TCP_ADDR=172.17.0.1
NODEAPI_ENV_http_proxy=http://10.0.2.2:3128
NODEAPI_PORT_3001_TCP_PORT=3001
NODEAPI_PORT_3001_TCP_PROTO=tcp
NODEAPI_PORT=tcp://172.17.0.1:3001
NODEAPI_ENV_NPM_CONFIG_LOGLEVEL=info
NODEAPI_NAME=/loving_carson/nodeapi
NODEAPI_ENV_NODE_VERSION=4.5.0
NODEAPI_ENV_https_proxy=http://10.0.2.2:3128
NODEAPI_PORT_3001_TCP=tcp://172.17.0.1:3001
root@fbfd0f8fa01d:/usr/src/app/src#
  

Комментарии:

1. Что docker version вы используете?