web-dev-qa-db-fra.com

Image Docker mongo 'Connexion refusée' depuis un autre conteneur

Je suis nouveau sur docker. J'essaie de créer un conteneur MongoDB et un conteneur NodeJS. Mon dossier ressemble:

version: '2'
services:
  backend:
    image: node:5.11-onbuild
    ports:
     - "3001:3001"
    volumes:
     - .:/code
    working_dir: "/code"
    links:
     - mongodb
  mongodb:
    image: mongo:3.3
    expose:
     - 27017

Il devrait s'exécuter npm install puis node .. Mais docker-compose up se termine par [MongoError: connect ECONNREFUSED 127.0.0.1:27017] tandis que la commande node .. Je pense que c'est à cause du bind_ip = 127.0.0.1 dans le fichier /etc/mongod.conf. Est-ce correct?

J'utilise boot2docker sur un système Win10.

Comment puis-je résoudre ce problème afin que le nœud puisse se connecter à MongoDB?

15
Piu130

Dans votre application principale, connectez-vous à mongodb:27017 au lieu de 127.0.0.1:27017. Où 'mongodb' est le nom de votre conteneur dans docker-compose.yml.

47
Thomasleveil

J'ai récemment rencontré un problème similaire. J'utilise Docker Toolbox sous Win 10 et voici comment cela a fonctionné pour moi:

1) J'ai dû vérifier l'URL que ma machine Docker par défaut utilise. Cela peut être vérifié en exécutant docker-machine ls commande. Il listera les machines disponibles:

NAME             ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
default          *        virtualbox   Running   tcp://192.168.99.100:1234           v17.06.0-ce
rancher-client   -        virtualbox   Stopped                                       Unknown
rancher-server   -        virtualbox   Stopped                                       Unknown

2) Lors de l'exécution de l'image mongodb, spécifiez le mappage de port

docker run -d -it -p 27017:27017 mongo

3) À ce stade, l'URL mongo valide ressemblerait à ceci

var dbhost = 'mongodb://192.168.99.100:27017/test

192.168.99.100 était l'URL de la machine par défaut à partir du point 1)

J'espère que cela aide quelqu'un.

7
Marcin

Vous devez dire au conteneur d'utiliser sa propre adresse IP au lieu de localhost.

Par exemple, supposons que vous avez généré du code d'échafaudage avec expressjs, vous devez écrire dans routes/index.js

var mongodb = require('mongodb');
router.get('/thelist', function(req, res){

  // Get a Mongo client to work with the Mongo server
  var MongoClient = mongodb.MongoClient;

  // Define where the MongoDB server is
  var url = 'mongodb://172.17.0.5:27017/dbname';

  // Connect to the server
  MongoClient.connect(url, function (err, db) {
  .........

172.17.0.5 est le $CONTAINER_IP

vous pouvez trouver l'ip du conteneur via $ docker inspect $CONTAINER_HOSTNAME | grep IPAddress

Si vous ne comprenez toujours pas, vous pouvez jeter un œil à mon Docker NodeJS et MongoDB app

5

Très probablement oui. 127.0.0.1 pointe vers localhost inside le conteneur mongodb, il n'est donc pas accessible de l'extérieur du conteneur. La liaison à 0.0.0.0 fonctionnera probablement.

Avec le lien que vous avez spécifié dans le docker-compose.yml, votre conteneur backend devrait alors pouvoir se connecter au conteneur mongo via mongodb:27017

5
thaJeztah