2015-03-04 6 views
10

Ich habe Probleme mit Docker-Compose, um einen Django-Container mit Postgres und Mongo-Container zu verknüpfen? Ich versuche "docker-compose up" zu verwenden, was die Mongo- und Postgrees-Container startet (da ich beides verbinden muss), aber die Django-App kann keine Verbindung zu mongodb herstellen. Meine django-compose.yml Dateiinhalte werden im Folgenden kopiert:docker-komponieren, um django mit mongodb zu laufen

db1: 
     image: postgres 
    db2: 
     image: mongo 
     ports: 
     - "27017:27017" 
    web: 
     build: . 
     command: python manage.py runserver 0.0.0.0:8000 
     volumes: 
     - .:/code 
     ports: 
     - "8000:8000" 
     links: 
     - db1 
     - db2 

Es mit Postgres mit Standardeinstellung verbinden ist. Ich kann auch lokal zum Mongodb-Port telnet. Trotzdem bekomme ich diesen Fehler beim Start des Web-Container:

File "/usr/local/lib/python2.7/site-packages/mongoengine/connection.py", line 124, in get_connection web_1 | raise ConnectionError("Cannot connect to database %s :\n%s" % (alias, e)) web_1 | mongoengine.connection.ConnectionError: Cannot connect to database default : web_1 | [Errno 111] Connection refused

PS: ich erfolgreich ein django-Postgres verbunden App auf meinem localhost begonnen hatte, aber es versäumt Anschluss an eine AWS-Instanz-DB. Das ist ein anderes Problem, das ich noch zu Wurzel von bekommen muss.

Antwort

6

Ich stieß auf ein ähnliches Problem, aber mit einem anderen Dienst (nicht MongoDB). Ich bin mir nicht sicher, was ich falsch mache, aber das ist, wie ich es lösen könnte:

import os 
import mongoengine 

MONGODB_HOST = os.environ.get('DB2_PORT_27017_TCP_ADDR', '127.0.0.1') 
mongoengine.connect(host=MONGODB_HOST) 
  • Mit DB2 ist der Name Ihres Dienstes in Docker-compose.yml
  • 27017 der Hafen des ausgesetzten Dienstes sein.
  • More about docker-compose environment variables
  • Ich würde das in meine Einstellungsdatei legen. Aber Sie sind frei, es zu setzen, wo immer Sie denken, dass es angemessen ist, je nach Projektarchitektur

UPDATE

Jetzt Andockfenster-komponieren Behälter erreichbar sind von anderen Diensten einen Hostnamen ähnlich wie ihre Pseudonyms gestattet. link documentation:

Containers for the linked service will be reachable at a hostname identical to the alias, or the service name if no alias was specified.

Und auf diese Weise Sie MongoDB wie folgt verbinden:

import mongoengine 

mongoengine.connect(host="db2") 
+0

Auf Host-Maschine ausführen 'Docker-compose Lauf yourappname env', sucht IP-Adresse, die auf Ihre Datenbank Bild verwendet, das ist, was Sie in einem Container zu Ihrer Datenbank ausgeführt verbinden. –

+0

das funktioniert für mich wie ein Charme, und nur für den Rekord, wenn Sie die gleiche Strategie für PORT verwenden, denken Sie daran, es mit int zu transformieren, etwas wie: ... '' port = int (MONGODB_PORT) '' ... – jfunez

1

Das Problem, das Sie ist konfrontiert, dass die Anwendung Behälter und der DB Container unabhängig voneinander starten und am wichtigsten ist, die App-Container wartet nicht, bis der DB-Container gestartet wird. Es gibt ab Docker 1.1.0 kein Feature, das solche Abhängigkeiten berücksichtigt.

Dies ist ein bekanntes Problem und wurde bereits discussed. Konsens scheint zu sein, dass dies nicht auf einer Docker-Compose-Ebene, sondern in Docker selbst gelöst werden sollte. Es gibt eine proposal bereits für die Bodenarbeit in Docker.

In meinem Fall habe ich gerade diese Art von Intelligenz in der Anwendung selbst gebaut. Ich überprüfe die Port-Konnektivität, bis sie erfolgreich ist, und starte dann den Rest der Anwendung.

+0

Danke für die Antwort vanthome. Ich habe dieses Problem auch schon kurz nachdem ich diese Nachricht gepostet habe erkannt und eine Optimierung vorgenommen, um zu überprüfen, ob der Mongo-Container bereit ist, bevor der Django-Container mit ihm verbunden wird. Das könnte ein anderes Problem gewesen sein, aber ich konnte trotzdem keine Verbindung herstellen. Nur möglich, dass ich eine Verbindung herstellen konnte, ohne docker-compose zu verwenden. Ich habe diese 2 Container einfach selbstständig gestartet, mit ip of mongo container in meinen django Einstellungen. Und es funktioniert in diesem Fall. Aber wie ist Docker-Compose dann nützlich? – anuprag

+0

Docker komponieren dient einem anderen Aspekt. Es ist kein Orchestrator, es ist nur eine Möglichkeit, eine Reihe von Containern auf einfache Weise zu starten und zu verknüpfen. – vanthome

+0

Ich habe ein ähnliches Problem mit @anuprag, und es scheint auch nicht die Lösung zu sein. Wenn ich "docker-compose run web/bin/bash" und "ping 172.17.0.52" (was die IP der Umgebungsvariablen 'DB_1_PORT' ist), bekomme ich 92 Bytes von 209d72d65b0c (172.17.0.53): Destination Host Unreachable ', was bedeuten würde, dass es der ganze mongodb-Behälter ist, der nicht oben ist. –

1

Sie sollten den Host-Namen wie in der Docker-Compose-Datei anstelle der IP-Adresse angeben.

Ich habe ähnliche Probleme bei der Verbindung von einer Tornado Web App zu Mongo DB konfrontiert. Hier ist mein Docker-komponieren.yml:

web: 
    build: . 
    ports: 
    - "8888:8888" 
    volumes: 
    - .:/code 
    links: 
    - db 
db: 
    image: mongo:3.0 

Hier ist meine Verbindungszeichenfolge:

motorengine.connect("db", host='db', port=27017, io_loop=io_loop) 

Mein Fehler war IP-Adresse angeben statt Hostnamen (db) wie in der Docker compose Datei.

0

Ich konnte Django und MongoDB container, beide Container verbinden. Ich habe Dockerfiles verwendet, um sowohl Container als auch Andockfenster zu erstellen, um die Container zu starten und sie miteinander verbinden zu lassen. Befolgen Sie einfach die Schritte in diesem repo. Es war notwendig für mich, Dockerfiles zu verwenden, um mehr Macht über die installierten Versionen der benötigten Bibliotheken zu haben, da die neuesten Versionen von Django und Mongoengine nicht kompatibel sind. Die stabilen Arbeits Versionen sind

Django==1.10.0 
pymongo==2.7.1 
six==1.10.0 
mongoengine==0.9.0 
Verwandte Themen