#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
вы используете?