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.
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"
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
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