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?
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.
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;
});
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
});