我有两个想要连接的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和一个参数。
答案 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#