2017-06-12 4 views
1

Ich bin neu in Docker, und ich versuche die einfachste von Setups mit Docker-Compose, aber nicht erfolgreich mit Mongodb verbinden.Docker-komponieren mongoose

Meine Docker-compose.local.yaml Datei:

version: "2" 
services: 
    posts-api: 
    build: 
     dockerfile: Dockerfile.local 
     context: ./ 
    volumes: 
     - ".:/app" 
    ports: 
     - "6820:6820" 
    depends_on: 
     - mongodb 
    mongodb: 
    image: mongo:3.5 
    ports: 
     - "27018:27018" 
    command: mongod --port 27018 

Meine Docker-Datei:

FROM node:7.8.0 
MAINTAINER Livefeed '[email protected]' 

RUN mkdir /app 
VOLUME /app 
WORKDIR /app 

ADD package.json yarn.lock ./ 
RUN eval rm -rf node_modules && \ 
yarn 

ADD server.js . 
RUN mkdir config src 
ADD config config/ 
ADD src src/ 

EXPOSE 6820 
EXPOSE 27018 

CMD yarn run local 

In server.js versuche ich mit verbinden:

mongoose.connect('mongodb://localhost:27018'); 

I auch versucht:

Um Docker-compose laufen:

docker-compose -f docker-compose.local.yaml up --build 

Und ich erhalte den Fehler:

connection error: { MongoError: failed to connect to server [localhost:27018] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27018] 

Was bin ich?

+0

@Tamas, ja, ich habe dies getan, in meinem Docker.local .yaml Datei, ich werde es der Beschreibung hinzufügen – Trace

+0

Entschuldigung, ich meinte, Dienste: mongo: Bild: 'Mongo: 3,5' Ports: '27018: 27017'. – Tamas

+0

@Tamas Ich möchte am Port 27018 laufen, weil ich eine andere Mongo-Instanz pro Microservice laufen lassen möchte – Trace

Antwort

4

In server.js verwenden versprach mongodb statt localhost:

mongoose.connect('mongodb://mongodb:27018'); 

Da Container im selben Netzwerk kann kommunizieren unicate mit ihrem Dienstnamen.

Bedenken Sie, dass jeder Container und Ihr Host einen eigenen localhost haben. Jeder localhost ist ein anderer host: Container A, Container B, Ihr Host (jeder hat seine eigene Netzwerkschnittstelle).


Edit:

Seien Sie sicher, dass Ihre Mongo aufstehen:

docker-compose logs mongodb 
docker-compose ps 

Manchmal ist es nicht, weil der Speicherplatz aufstehen.


Edit 2:

Bei neueren Versionen von Mongo, müssen Sie auch auf alle Schnittstellen zu hören geben:

command: mongod --port 27018 --bind_ip_all 
+0

Ich habe das versucht, aber leider mit genau dem gleichen Ergebnis ... Aber mit den Abhängigkeiten oder Links, sollte es nicht funktionieren? Ich werde die Fragedetails aktualisieren. – Trace

+1

In der Tat, Sie brauchen nicht beide. Mit 'version:" 2 "' oder 3 erhalten Sie Ihre Container in einem Andocknetzwerk, sodass sie mithilfe ihrer Servicenamen eine Verbindung herstellen können. (Links und depends_on fügen nur Abhängigkeitsinformationen hinzu) – Robert

+0

Wenn ich das versuche, heißt es: 'Kann keine passende Konfigurationsdatei in diesem Verzeichnis oder einem der übergeordneten Elemente finden. Sind Sie im richtigen Verzeichnis? 'Ich benutze eine Datei mit dem Namen' docker-compose.local.yaml ', entsprechend der Umgebung (ich benutze config.js). Docker ps -a zeigt Mongo: 3,5 ist 6 Minuten. Seltsam. – Trace

1

Ich denke, dass Sie links Option in Ihrer Konfiguration hinzufügen sollten. Wie folgt aus:

ports: 
    - "6820:6820" 
depends_on: 
    - mongodb 
links: 
    - mongodb 

Update

Als ich

version: '2.1' 
services: 
    pm2: 
     image: keymetrics/pm2-docker-alpine:6 
     restart: always 
     container_name: pm2 
     volumes: 
     - ./pm2:/app 
     links: 
     - redis_db 
     - db 
     environment: 
     REDIS_CONNECTION_STRING: redis://redis_db:6379 

    nginx: 
     image: firesh/nginx-lua 
     restart: always 
     volumes: 
     - ./nginx:/etc/nginx 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
     ports: 
     - 80:80 
     links: 
     - pm2 

     s3: # mock for development 
     image: lphoward/fake-s3:latest 

    redis_db: 
     container_name: redis_db 
     image: redis 
     ports: 
     - 6379:6379 

    db: # for scorebig-syncer 
     image: mysql:5.7 
     ports: 
     - 3306:3306 
+4

Links gelten als veraltet. Verwenden Sie Dockers DNS und Netzwerke, um Container miteinander zu verbinden, wie Robert es vorschlägt. – BMitch