web-dev-qa-db-fra.com

connexion à mongodb local à partir du conteneur Docker

J'ai un serveur local mongoDB fonctionnant sur mongodb: //127.0.0.1: 27017. Mon nom de base de données est localv2. J'ai une application node/express avec le Dockerfile comme suit:

FROM node:7.5

RUN npm install -g pm2

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app
RUN npm install

COPY . /usr/src/app

EXPOSE 3002

ENV NODE_ENV local

CMD pm2 start --no-daemon server.js

Le fichier server.js a une connexion à mongodb local avec le code suivant:

app.db = mongoose.connect("mongodb://127.0.0.1:27017/localv2", options);

Cela ne fonctionne pas lorsque je tourne un conteneur à partir de l'image créée à l'aide du Dockerfile ci-dessus. J'ai lu quelque part que Docker crée un VLAN avec sa propre adresse IP gatway. Lorsque je docker inspect mon conteneur, mon adresse IP de passerelle: 172.17.0.1.

Même en changeant la connexion mongodb en

app.db = mongoose.connect("mongodb://172.17.0.1:27017/localv2", options)

et reconstruire l'image et démarrer un nouveau conteneur, je reçois toujours l'erreur:

MongoError: failed to connect to server [172.17.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 172.17.0.1:27017]

Commande pour exécuter le conteneur: docker run -p 3002:3002 image-name

Veuillez aider.

21
chaudharyp

Ajouter @ vlad-holubiev comme réponse ici car cela a fonctionné pour moi et aide les utilisateurs à le trouver.

Utilisation de option hôte réseau lors de l'exécution de docker , comme spécifié dans les documents:

Lorsque le réseau est défini sur Hôte, un conteneur partagera la pile réseau de l'hôte et toutes les interfaces de l'hôte seront disponibles pour le conteneur. Le nom d'hôte du conteneur correspondra au nom d'hôte sur le système hôte.

docker run -d -e ROOT_URL=http://localhost -e MONGO_URL=mongodb://localhost:27017 --network="Host"
16
elpddev

Sur Docker pour Mac, vous pouvez utiliser Host.docker.internal si votre mongo fonctionne sur votre hôte local. Vous pourriez avoir votre code lu dans une variable env pour l'hôte mongo et le définir dans le Dockerfile comme ceci:

ENV MONGO_Host "Host.docker.internal"

Voir ici pour plus de détails sur https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

13
airpower44

Un conteneur Docker est distinct de votre ordinateur,
Vous ne pourrez donc pas vous connecter à votre localhost.
Vous devez exécuter le serveur mongo sur un conteneur et vous connecter avec le nom de l'image.

mongodb://CONTAINER-NAME:port
11
Daniel Taub