web-dev-qa-db-fra.com

Connexion au conteneur mongo docker depuis l'hôte

J'exécute Docker sur OS X avec:

docker run --name mongo -p 27017:27017 -v ./data/db:/data/db -d mongo mongod

et en utilisant l'ip que je reçois de:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <cid>

dans:

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var url = 'mongodb://<ip>:27017';

MongoClient.connect(url, function(err, db) {
   assert.equal(null, err);
   db.close();
});

et je reçois une erreur de temporisation.

J'utilise le référentiel mongo officiel de Docker Hub. Y a-t-il une configuration supplémentaire que je dois faire pour me connecter à partir de l'hôte?

19
ggeise

Le code node.js est-il exécuté à partir d'un conteneur ou de l'hôte?

S'il se trouve sur l'hôte, utilisez simplement l'adresse de l'hôte local, c'est-à-dire:

var url = 'mongodb://localhost:27017';

Cela fonctionnera car vous avez publié le port avec -p 27017:27017.

Si le code s'exécute à l'intérieur d'un conteneur, il serait préférable de le réécrire pour utiliser des liens et faire référence au conteneur mongo par son nom, par exemple:

var url = 'mongodb://mongo:27017';

Ensuite, lorsque vous lancez le conteneur avec le code Node.js, vous pouvez simplement faire quelque chose comme:

docker run -d --link mongo:mongo my_container

Docker ajoutera alors une entrée à /etc/hosts à l'intérieur du conteneur afin que le nom mongo se résout en IP du conteneur mongo.

31
Adrian Mouat

Si vous utilisez un réseau défini par l'utilisateur, vous devriez pouvoir le récupérer sans lier ni spécifier 27017

const MONGO_NAME_STR = "mongodb://" + "your_docker_container_name";
var db = {};

mongo_client.connect(MONGO_NAME_STR, function(err, _db){
  //some err handling
  db = _db;
});
1
fullstacklife

Une autre option pour tous ceux qui utilisent docker-compose

version: '3.1'
services:
  mongo:
    image: mongo
    container_name: "mongo"
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - './dockervolume/mongodb:/data/db'
    ports:
      - 27017:27017

Et vous pouvez vous connecter en utilisant la chaîne URL

    MongoClient.connect("mongodb://root:example@localhost:27017")
        .then(()=>{
            console.log("db connect success");
        })
        .catch((err)=>{
            throw err
        });

1
roll