it-swarm.com.de

Kann nicht mit Docker Mongodb verbunden werden

Ich habe nicht beide Docker und Knoten viel verwendet, also hoffe ich, dass es ein einfacher Fehler ist. Ich benutze Docker Compose. Wenn ich über einen Browser auf http://localhost:27017/ zugreife, erhalte ich Folgendes:

Sie versuchen anscheinend, über HTTP auf MongoDB über den nativen Treiberport zuzugreifen.

Auch Protokolle deuten darauf hin, dass mein Mongodb gesund ist. Letzte Zeile von dem Zeitpunkt an, an dem ich versucht habe, über meinen Browser darauf zuzugreifen.

2017-01-25T21: 11: 13.509 + 0000 I JOURNAL [initandlisten] journal dir =/data/db/journal 2017-01-25T21: 11: 13.509 + 0000 I JOURNAL [initandlisten] recover: Keine Journaldateien vorhanden, keine Wiederherstellung benötigt 2017-01-25T21: 11: 13.546 + 0000 I JOURNAL [Haltbarkeit] Haltbarkeits-Thread gestartet 2017-01-25T21: 11: 13.547 + 0000 I JOURNAL [Journalschreiber] Journalschreiber-Thread gestartet 2017-01-25T21: 11: 13.568 +0000 I CONTROL [initandlisten] MongoDB wird gestartet: pid = 1 port = 27017 dbpath =/data/db 64-bit Host = 150c248f4cc7 2017-01-25T21: 11: 13.568 + 0000 I CONTROL [initandlisten] db version v3.0.2 2017 -01-25T21: 11: 13.568 + 0000 I CONTROL [initandlisten] Git-Version: 6201872043ecbbc0a4cc169b5482dcf385fc464f 2017-01-25T21: 11: 13.569 + 0000 I CONTROL [initandlisten] OpenSSL-Version: OpenSSL 1.0.1e 11 Feb 2013-01-25T21 : 11: 13.569 + 0000 I CONTROL [initandlisten] Build-Info: Linux IP-10-171-120-232 3.2.0-4-AMD64 # 1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION = 1_49 2017-01-25T21: 11: 13.569 + 0000 I CONTROL [initandlisten] Zuweiser: tcmal loc 2017-01-25T21: 11: 13.569 + 0000 I CONTROL [initandlisten] -Optionen: {} 2017-01-25T21: 11: 13.573 + 0000 I NETWORK [initandlisten] wartet auf Verbindungen auf Port 27017 2017-01-25T21: 11 : 17.843 + 0000 I NETWORK [initandlisten] Verbindung akzeptiert ab 172.20.0.1:44148 # 1 (1 Verbindung jetzt geöffnet) 2017-01-25T21: 11: 17.843 + 0000 I NETWORK [initandlisten] Verbindung akzeptiert ab 172.20.0.1:44146 # 2 (2 Verbindungen jetzt offen) 2017-01-25T21: 11: 17.853 + 0000 I NETWORK [conn2] Endverbindung 172.20.0.1:44146 (1 Verbindung jetzt offen) 2017-01-25T21: 11: 17.998 + 0000 I NETWORK [ conn1] Verbindung beenden 172.20.0.1:44148 (0 Verbindungen jetzt offen)

Es sieht also so aus, als ob mein Mongodb läuft. Wenn ich in meiner Knotenanwendung versuche, darauf zuzugreifen, erhalte ich.

{MongoError: Verbindung zum Server [localhost: 27017] konnte beim ersten Herstellen einer Verbindung im Pool nicht hergestellt werden. (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:326:35) bei emitOne (events.js: 96: 13) bei Pool.emit (events.js: 188: 7) bei Verbindung. (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:270:12) bei Object.onceWrapper (events.js: 290: 19) bei emitTwo (events.js: 106: 13) at Connection.emit (events.js: 191: 7) at Socket. (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:175:49) bei Object.onceWrapper (events.js: 290: 19) bei emitOne (events.js: 96: 13) name: 'MongoError', message: 'Verbindung zum Server [localhost: 27017] beim ersten Verbinden fehlgeschlagen'}

Mein Code versucht auf die Mongodb zuzugreifen

const express = require('express');
const gh = require('./src/fetch');
const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://localhost:27017/myApp';

// Constants
const PORT = 8888;

// App
const app = express();

app.get('/', function (req, res) {
    MongoClient.connect(url, function (err, db) {
        if (err) {
            console.log(err);
        } else {
            console.log("Connected correctly to server");
            db.close();
        }

    });
    res.send('Hello world\n');
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

Mein Docker-Compose sieht so aus.

version: '2'
services:
  web:
    image: gh-api
    ports:
      - "8888:8888"
    environment:
      - KEY=abc
    restart: always
    links:
      - mongoDB
    depends_on:
          - mongoDB
  mongoDB:
      image: mongo:3.0.2
      ports:
        - "27017:27017"

Dockerfile für gh-api

FROM node:7.4-onbuild

EXPOSE 8888
7
pethel

Könnten Sie die URL Ihres Mongodb ändern von:

const url = 'mongodb://localhost:27017/myApp';

zu

const url = 'mongodb://mongoDB/myApp';

Ich hatte ein ähnliches Problem mit meiner Demo-Blog-Anwendung und mit dieser Änderungsanwendung begann es zu funktionieren.

Bearbeiten

Die beste Erklärung, die ich finden konnte, ist Erklärung der Docker-Compose-Links .

Container für den verknüpften Dienst sind über einen Hostnamen erreichbar, der mit dem Aliasnamen identisch ist, oder über den Dienstnamen, wenn kein Alias ​​angegeben wurde.

Um also vom mongoDB container auf web container zuzugreifen, sollten Sie mongoDB als Hostnamen im web container verwenden.

19
Ivan Vasiljevic

Sie versuchen anscheinend, über HTTP auf MongoDB über den nativen Treiberport zuzugreifen.

Dieser Port soll vom Mongo-Fahrer benutzt werden. Wenn Sie wirklich auf die Rest-Schnittstelle zugreifen möchten/müssen, müssen Sie Port 28017 verwenden und Mongo mit dem Flag --rest starten. Ein Beispiel:

$ docker run --rm -p 28017:28017 mongo mongod --rest

Verwenden Sie den von Ivan angegebenen Dienstnamen, um mit docker compose auf einen Container von einem anderen aus zuzugreifen.

0
Salem

In meinem Fall war alles korrekt eingerichtet, genau wie in dieser Frage beantwortet. Allerdings wurde dieser Fehler durch "boot race" verursacht. Im Grunde bootete meine Node-App vor dem Mongo-Image und versuchte daher, eine Verbindung mit dem Mongo herzustellen, bevor es betriebsbereit war. Also habe ich meinen Verbindungscode geändert, um es erneut zu versuchen:

init().then((mongo) => main({ mongo })).catch(e => init())

function init(){
  return MongoClient.connect(mongoConnectionURL)
}

function main({ mongo }){
  const server = express()
  server.listen(port, Host);
}

Ich dachte, dies sollte mit der Eigenschaft depends_on in der Datei compose gelöst werden, aber soweit ich weiß, stellt depends_on nur sicher, dass andere Dienste gestartet werden, und stellt nicht sicher, dass sie in der richtigen Reihenfolge initialisiert wurden.

0
Kunok