12 votes

Impossible de se connecter à MongoDB dans docker

En utilisant l'outil officiel mongo depuis le docker hub, j'exécute la commande suivante pour le faire fonctionner :

docker run --name api -p 127.0.0.1:27017:27017 -p 127.0.0.1:28017:28017 -d mongo

Puis à partir d'un autre terminal Shell, j'exécute mongo

Cependant, je continue à obtenir l'erreur suivante :

MongoDB shell version: 3.2.3
connecting to: test
2016-02-18T13:52:08.110-0700 I NETWORK  [thread1] Socket recv() errno:104 Connection reset by peer 127.0.0.1:27017
2016-02-18T13:52:08.110-0700 I NETWORK  [thread1] SocketException: remote: (NONE):0 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:27017] 
2016-02-18T13:52:08.110-0700 E QUERY    [thread1] Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27017'  :
connect@src/mongo/shell/mongo.js:224:14
@(connect):1:6

exception: connect failed

J'ai vérifié les journaux pour le conteneur, et tout semblait correct :

2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=73334e5089e1
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] db version v3.2.3
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] git version: b326ba837cf6f49d65c2f85e1b70f6f31ece7937
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] modules: none
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] build environment:
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten]     distmod: debian71
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten]     distarch: x86_64
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] options: {}
2016-02-18T20:51:20.542+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=8G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] 
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] 
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] 
2016-02-18T20:51:20.616+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2016-02-18T20:51:20.616+0000 I NETWORK  [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
2016-02-18T20:51:20.633+0000 I NETWORK  [initandlisten] waiting for connections on port 27017

Quel est le problème avec Docker ou Mongo ? J'ai cherché partout une réponse, mais rien n'a fonctionné jusqu'à présent. Est-ce que Docker ou Mongo est en panne ?

Edita: J'ai fait quelques recherches supplémentaires et j'ai découvert que je ne pouvais pas accéder à Internet depuis l'intérieur du conteneur. Je m'y connecte en exécutant docker exec -ti api /bin/bash et ensuite j'essaye d'envoyer un ping à google ou autre, et la commande se bloque.

Je n'arrive à obtenir une connexion internet du conteneur au monde extérieur qu'en utilisant --net=host dans le docker run commandement.

8voto

Vous devez indiquer au conteneur d'utiliser sa propre adresse IP au lieu de l'adresse locale.

Par exemple, supposons que vous ayez 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) {
  .........

donde 172.17.0.5 est le $CONTAINER_IP

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

Si pas d'internet dans le conteneur

Ouvrir avec sudo sudo vim /etc/NetworkManager/NetworkManager.conf et commentez la ligne dns=dnsmasq donc vous auriez maintenant :

[main]                        
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq                  

[ifupdown]                    
managed=false                 

Edit : nom du service au lieu de l'IP

Vous pouvez maintenant utiliser nom du service au lieu de l'adresse IP du conteneur, par exemple :

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

4voto

Sobrique Points 3695

Le problème ici est que si un conteneur écoute sur 127.0.0.1, alors l'hôte ne peut pas lui affecter des ports.

Vous devez écouter sur 0.0.0.0 ou similaire, et ensuite le -p peut atteindre l'interface du conteneur.

3voto

hyperloopfan Points 21

J'ai eu le même problème mais j'ai trouvé un autre moyen de résoudre ce problème. Vous pouvez simplement passer le paramètre réseau lors de l'exécution de l'image docker et de cette façon, docker pointe vers le localhost correct.

docker run --network="host" ....

Source de cette solution

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X