2017-05-14 5 views
3

Ich habe Probleme, eine nodeJS-Anwendung, die als Andock-Container ausgeführt wird, mit einer mongoDB zu verbinden. Lassen Sie mich erklären, was ich bisher getan haben:So verbinden Sie den docket-Container nodeJS mit mongoDB

$ docker ps 

CONTAINER ID IMAGE  COMMAND     CREATED  STATUS  PORTS  NAMES 
3a3732cc1d90 mongo:3.4 "docker-entrypoint..." 3 weeks ago Up 3 weeks 27017/tcp mongo_live 

Wie Sie sehen können, gibt es bereits ein Lauf Mongo Docker Behälter ist.

Jetzt bin ich meine NodeJS Anwendung Docker Behälter laufen (die eine Ansammlung von meteorJS ist):

$ docker run -it 0b422defbd59 /bin/bash 

In diesem Docker Behälter Ich möchte die Anwendung auszuführen, indem Sie:

$ node main.js 

Jetzt bekomme ich den Fehler

Error: MONGO_URL must be set in environment 

Ich habe bereits versucht, MONGO_URL mit der Einstellung:

ENV MONGO_URL mongodb://mongo_live:27017/ 

Aber das funktioniert nicht:

MongoError: failed to connect to server [mongo_live:27017] on first connect 

Also meine Frage ist, wie man eine DB verbinden, die - soweit ich verstehen - ‚außerhalb‘ des Laufbehälter. Alternativ wie richte ich eine neue DB für diesen Container ein?

Antwort

5

Es gibt mehrere Möglichkeiten, dies zu tun.

  • führen Sie Ihre Anwendung im gleichen Netzwerk wie Ihr mongodb:

    docker run --net container:mongo_live your_app_docker_image 
    
    # then you can use mongodb in your localhost 
    $ ENV MONGO_URL mongodb://localhost:27017/ 
    
  • Sie können auch zwei Container verlinken:

    docker run --link mongo_live:mongo_live you_app_image .. 
    # Now mongodb is accessible via mongo_live 
    
  • Verwendung mongodb Behälter IP-Adresse:

    docker inspect -f '{{.NetworkSettings.IPAddress}}' mongo_live 
    # you will get you container ip here 
    
    $ docker run -it 0b422defbd59 /bin/bash 
    # ENV MONGO_URL mongodb://[ip from previous command]:27017/ 
    
  • Sie können Ihre mongodb Port an den Host binden und Host-Hostnamen in Ihrer App verwenden

  • Sie docker network verwenden können, und beide Anwendungen im gleichen Netzwerk laufen

  • Sie --add-host mongo_live:<ip of mongo container> für Ihre Anwendung ausführen Docker passieren könnte und verwenden Sie dann mongo_live für mongodb url

  • Sie auch docker compose verwenden können, um Ihr Leben leichter zu machen;)

...

+0

ich Docker compose verwenden, aber nicht für diesen Fall. Lassen Sie mich erklären: Hier ist es Teil eines CI-Workflows. Daher führe ich docker build mit einer dockerfile aus: 'docker build -t $ CI_REGISTRY_IMAGE: test -f Dockerfile.test .'. Also ich weiß nicht, wie man docker komponieren in dieser Einstellung verwendet ... – user3142695

+0

Docker komponieren kann auch ein Bild erstellen, Sie können auch aufrufen, mit komponieren, die helfen können, Tests auszuführen. Es gibt auch die Option "--abort-on-container-exit", die auch zum Ausführen von Tests in CI geeignet ist. zum Beispiel: https://github.com/mobilityhouse/prometheus-bridge/blob/master/Jenkinsfile#L78 – Boynux

+0

Ich habe eine Docker-Compose-Lösung unten geschrieben, ich bin sicher, dass Sie das als Referenz verwenden und es herausfinden können –

1

Wenn Sie Container ausführen, arbeitet jeder Container in einem unabhängigen Netzwerk. Weil ein Container sich nicht mit anderen Punkten verbinden kann.

Das sind 3 Möglichkeiten Behälter

  1. Haben Sie ein wenig Aufhebens mit Docker Low-Level-network magic
  2. Connect Behälter durch localhost zu verbinden. Jeder Container muss Ports auf localhost (als Ihr mongo_live) verfügbar machen. Aber Sie müssen hinzufügen, Host ile auf localhost 127.0.0.1 mongo_live (Dies ist der einfachste Weg)
  3. Verwenden Sie docker-compose. Es ist ein praktisches Werkzeug zum Zusammenarbeiten vieler Behälter. (Das ist richtig)

hinzufügen mongodb zu Anwendung Behälter Art und Weise nicht Andockfenster.

0

Verwenden Sie bitte Snippet für Ihre docker-compose.yml Datei, ersetzen Sie Kommentare durch Ihre tatsächlichen. Sollte dein Problem lösen.

version: '2' 
    services: 
     db: 
     build: <image for mongoDB> 
     ports: 
      - "27017:27017" # whatever port u r using 
     environment: 
      #you can specify mondo db username and stuff here 
     volumes: 
      - #load default config for mondodb from here 
      - "db-data-store:/data/db" # path depends on which image you use 
     networks: 
      - network 
    nodejs: 
     build: #image for node js 
     expose: 
      - # mention port for nodejs 
     volumes: 
      - #mount project code on container 
     networks: 
      - network 
     depends_on: 
      - db 

networks: 
    network: 
    driver: bridge 

Bitte beachten Sie die unten stehenden Links für Referenzen verwenden:
1) NodeJs Docker
2) MongoDb docker
3) docker-compose tutorial

Best of Luck