2015-03-04 34 views
10

Ho problemi con l'uso di docker-compose per collegare un contenitore django con postgres e contenitori mongo? Sto cercando di utilizzare "docker-compose up" che avvia i contenitori mongo e postgres (poiché devo collegarli entrambi), ma l'app django non è ancora in grado di connettersi a mongodb con le impostazioni predefinite. Le mie contenuto dei file django-compose.yml vengono copiati di seguito:docker-compose per eseguire django con mongodb

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 

Esso si connette con Postgres con le impostazioni predefinite. Posso anche telnet alla porta mongodb localmente. Eppure, ottengo questo errore sulla partenza del contenitore web:

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: avevo iniziato con successo a django-postgres collegati applicazione sul mio localhost, ma è venuto a mancare il collegamento al db, su un'istanza AWS. Questo è un altro problema a cui devo ancora accedere.

risposta

6

Mi sono imbattuto in un problema simile ma con un altro servizio (non MongoDB). Non sono sicuro di quello che sto facendo male, ma questo è come potevo risolverlo:

import os 
import mongoengine 

MONGODB_HOST = os.environ.get('DB2_PORT_27017_TCP_ADDR', '127.0.0.1') 
mongoengine.connect(host=MONGODB_HOST) 
  • Con DB2 essere il nome del servizio nel finestra mobile-compose.yml
  • 27017 essendo il porto del servizio esposto.
  • More about docker-compose environment variables
  • Lo inserisco nel file delle impostazioni. Ma tu sei libero di mettere dove pensi che sia appropriata a seconda del progetto di architettura

UPDATE

Ora finestra mobile-compongono i contenitori sono raggiungibili con altri servizi utilizzando un nome host simile al loro alias. 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.

E in questo modo è possibile connettersi a MongoDB in questo modo:

import mongoengine 

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

Sulla macchina host eseguire 'run nomeapplicazione env' finestra mobile-comporre, ricercare l'indirizzo IP che si riferiva alla vostra immagine del database, è ciò che si utilizza per connettersi al database in esecuzione in un contenitore. –

+0

questo funziona per me come un fascino, e per la cronaca, quando si utilizza la stessa strategia per PORT, ricordarsi di trasformarlo con int, qualcosa come: ... '' port = int (MONGODB_PORT) '' ... – jfunez

1

Il problema si faccia è che il contenitore di applicazione e il contenitore DB iniziano in modo indipendente gli uni dagli altri e, soprattutto, la il contenitore dell'app non attenderà fino all'avvio del contenitore DB. A partire da docker comporre 1.1.0 nessuna funzionalità che consentirebbe di considerare tali dipendenze.

Questo è un problema ben noto ed è stato già discussed. Il consenso sembra essere che questo non dovrebbe essere risolto su un livello di composizione docker ma nella finestra mobile stessa. C'è uno proposal già per il fondamento nella finestra mobile.

Nel mio caso, ho appena creato questo tipo di intelligenza nell'applicazione stessa. Controllo la connettività della porta finché non esito positivo e quindi avvio il resto dell'applicazione.

+0

Grazie per la risposta vanthome. Ho anche realizzato questo problema subito dopo aver postato questo messaggio e ho apportato una modifica per verificare se il contenitore mongo è pronto prima che il contenitore django si colleghi ad esso. Potrebbe essere stato un altro problema, ma ancora non riuscivo a connettermi. L'unico modo possibile per connettersi era senza usare docker-compose. Ho appena iniziato questi 2 contenitori in modo indipendente, con l'ip del contenitore mongo specificato nelle mie impostazioni django. E funziona in questo caso. Ma allora come è utile la docker-compose? – anuprag

+0

La composizione Docker ha un aspetto diverso. Non è un orchestratore, è solo un modo per avviare e collegare un gruppo di contenitori in modo semplice. – vanthome

+0

Sto affrontando un problema simile a @anuprag, e non sembra essere la soluzione neanche. Se I 'docker-compose esegue web/bin/bash' e' ping 172.17.0.52' (che è l'IP della variabile d'ambiente 'DB_1_PORT'), ottengo' 92 byte da 209d72d65b0c (172.17.0.53): Destination Host Unreachable ', il che significherebbe che è l'intero contenitore mongodb che non è attivo. –

1

È necessario specificare il nome host come nel file di composizione del docker, anziché all'indirizzo IP.

Ho riscontrato problemi simili nel collegarmi da un'app Web Tornado a Mongo DB. Ecco la mia docker-compose.yml:

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

Qui è la mia stringa di connessione:

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

Il mio errore è stato quello di specificare l'indirizzo IP invece del nome host (db), come nel file finestra mobile di composizione.

0

Sono stato in grado di containerizzare Django e MongoDB, collegare entrambi i contenitori. Ho usato i Dockerfiles per costruire sia i contenitori che la finestra mobile per avviare i contenitori e averli collegati. Basta seguire i passaggi in questo repo. Per me era necessario utilizzare Dockerfiles per avere più potenza sulle versioni installate delle librerie necessarie perché le ultime versioni di Django e mongoengine non sono compatibili. Le versioni di lavoro stabili sono

Django==1.10.0 
pymongo==2.7.1 
six==1.10.0 
mongoengine==0.9.0 
Problemi correlati