Je n’ai pas beaucoup utilisé le docker et le nœud, j’espère que ce sera une simple erreur. J'utilise docker compose. Si je me connecte via un navigateur, http://localhost:27017/
je reçois un:
On dirait que vous essayez d'accéder à MongoDB via HTTP sur le port de pilote natif .
Les journaux suggèrent également que mon mongodb est sain. La dernière ligne depuis le moment où j'ai essayé d'accéder via mon navigateur, je suppose.
2017-01-25T21: 11: 13.509 + 0000 I JOURNAL [initandlisten] journal Dir =/data/db/journal 2017-01-25T21: 11: 13.509 + 0000 I JOURNAL [Initandlisten ] récupérer: aucun fichier journal présent, aucune récupération nécessaire 2017-01-25T21: 11: 13.546 + 0000 I JOURNAL [durabilité] Fil de durabilité démarré le 2017-01-25T21: 11: 13.547+ 0000 I JOURNAL [rédacteur de journal] Le fil d'écriture de journal a commencé 2017-01-25T21: 11: 13.568 + 0000 I CONTROL [Initandlisten] MongoDB à partir de: pid = 1 port = 27017 chemin_base =/data /db Hôte 64 bits = 150c248f4cc7 20/01/2017: 11: 13.568 + 0000 CONTRÔLE [initandlisten] db version v3.0.2 2017-01-25T21: 11: 13.568 + 0000 I CONTROL [initandlisten] version git: 6201872043ecbbc0a4cc169b5482dcf385fc464f 2017-01-25T21: 11: 13.569 + 0000 I CONTROL [initandlisten] version OpenSSL: OpenSSL 1.0.1e février 2013 2017-01-25T21: 11: 13.569 + 0000 I CONTROL [initandlisten] informations de construction: Linux ip-10-171-120-232 3.2.0-4-AMD6 4 # 1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION = 1_49 2017-01-25T21: 11: 13.569 + 0000 I COMMANDE [Initandlisten] allocateur: tcmalloc 2017-01-25T21: 11 : 13.569 + 0000 I COMMANDES [initandlisten] options: {} 2017-01-25T21: 11: 13.573 + 0000 I RÉSEAU [initandlisten] en attente de connexions sur le port 27017 2017-01-25T21: 11: 17.843 + 0000 I connexion [initandlisten] RESEAU Acceptée à partir du 172.20.0.1:44148 # 1 (1 connexion est maintenant ouverte) 2017-01-25T21: 11: 17.843 + 0000 I connexion [initandlisten] NETWORK Acceptée à partir de 172.20.0.1:44146 # 2 (2 connexions sont maintenant ouvertes) 2017-01-25T21: 11: 17.853 + 0000 I NETWORK [conn2] connexion de fin 172.20.0.1:44146 (1 connexion maintenant ouverte) 2017-01-25T21: 11: 17.998 + 0000 I RÉSEAU [conn1] connexion de fin 172.20.0.1:44148 (0 connexions maintenant ouvrir)
Donc, il semble que mon mongodb est en cours d'exécution. Dans mon application de noeud, j'essaie d'y accéder.
{MongoError: échec de la connexion au serveur [localhost: 27017] le premier Connectez-vous Au pool. (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:326:35) à emitOne (events.js: 96: 13) à Pool. emit (events.js: 188: 7) à Connection. (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:270:12) sur Object.onceWrapper (events.js: 290: 19) sur emitTwo (events.js: 106: 13) sur Connection.emit (events.js: 191: 7) sur Socket. (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:175:49) sur Object.onceWrapper (events.js: 290: 19) sur emitOne (events.js: 96: 13) nom: 'MongoError', message: 'impossible de se connecter au serveur [localhost: 27017] lors de la première connexion'}
Mon code essayant d'accéder à la mongodb
const express = require('express');
const gh = require('./src/fetch');
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/myApp';
// Constants
const PORT = 8888;
// App
const app = express();
app.get('/', function (req, res) {
MongoClient.connect(url, function (err, db) {
if (err) {
console.log(err);
} else {
console.log("Connected correctly to server");
db.close();
}
});
res.send('Hello world\n');
});
app.listen(PORT);
console.log('Running on http://localhost:' + PORT);
Mon docker-compose ressemble à ceci.
version: '2'
services:
web:
image: gh-api
ports:
- "8888:8888"
environment:
- KEY=abc
restart: always
links:
- mongoDB
depends_on:
- mongoDB
mongoDB:
image: mongo:3.0.2
ports:
- "27017:27017"
Dockerfile pour gh-api
FROM node:7.4-onbuild
EXPOSE 8888
Pourriez-vous changer l'URL de votre mongodb de:
const url = 'mongodb://localhost:27017/myApp';
à
const url = 'mongodb://mongoDB/myApp';
J'ai eu un problème similaire avec mon application de blog de démonstration et avec cette application de changement a commencé à fonctionner.
La meilleure explication que j'ai pu trouver est explication des liens docker-composer .
Les conteneurs du service lié seront accessibles à un nom d'hôte Identique à l'alias, ou au nom du service si aucun alias n'a été spécifié.
Donc, pour accéder au conteneur mongoDB
à partir du conteneur web
, vous devez utiliser mongoDB
comme nom d'hôte dans le conteneur web
.
On dirait que vous essayez d'accéder à MongoDB via HTTP sur le port du pilote natif.
Ce port doit être utilisé par le pilote Mongo. Si vous voulez vraiment/devez accéder à l’interface de repos, vous devez utiliser le port 28017 et démarrer mongo avec l’indicateur --rest
. Un exemple:
$ docker run --rm -p 28017:28017 mongo mongod --rest
Pour accéder à un conteneur depuis un autre, avec docker compos, utilisez le nom du service, comme indiqué par Ivan.
Dans mon cas, tout était correctement configuré, comme indiqué dans cette question. Cependant, cette erreur est due à une "course au démarrage". En fait, mon application Node démarrait avant l'image mongo et essayait donc de se connecter à mongo avant qu'elle ne soit opérationnelle. J'ai donc changé mon code de connexion pour réessayer avec quelque chose comme ceci:
init().then((mongo) => main({ mongo })).catch(e => init())
function init(){
return MongoClient.connect(mongoConnectionURL)
}
function main({ mongo }){
const server = express()
server.listen(port, Host);
}
Je pensais que cela était censé être résolu en utilisant la propriété depends_on
dans le fichier de composition, mais si je comprends bien, depends_on
s'assure uniquement de démarrer d'autres services, ne s'assure pas qu'ils ont été initialisés dans le bon ordre.