如何将我的nodeApp与在Docker上运行的另一个NodeApp连接?

时间:2016-09-30 12:48:24

标签: docker nodes

我有两个想要连接的NodeJS容器。

第一个用作返回json文件的API,

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);

并且第二个(我的webservice)向此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);
                  }
                  });

我已经将第二个容器链接到第一个容器(docker run -d --link nodeapi:nodeapi -v /vagrant_workspace/nodejs_test/src:/usr/src/app/src eddy/node_test:v3)。

但我不知道如何在第二个代码中编写代码,以便在第二个代码中调用第一个容器中的url和一个参数。

2 个答案:

答案 0 :(得分:0)

Links are a legacy feature - 目前执行此操作的首选方法是使用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处理发现。

答案 1 :(得分:0)

嗨埃尔顿,先谢谢你的回答,但是, 当我尝试使用docker网络时,我就不会这样做了:

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

但是我也可以通过网络ping 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,如:

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);
                  }
                  });

请求确实无效。

您可以看到Container ENV

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#