2014-10-10 18 views
10

Mam dwa kontenery Docker. Pierwszym z nich jest kontener Postgresql, który uruchamiam za pomocą następującego polecenia.Łączenie Django i PostgreSQL z Dockerem

sudo docker run -v /home/mpmsp/project/ezdict/postgresql/data:/var/lib/postgresql/data -p 127.0.0.1:5432:5432 -name my-postgres -d postgres 

Jest on oparty na official image i działa doskonale, mogę podłączyć do PostgreSQL z hosta.

Drugi pojemnik to pojemnik z moją aplikacją Django. Obraz jest zbudowana w oparciu o następujące Dockerfile (w oparciu o this image):

FROM python:3-onbuild 
EXPOSE 8000 5432 
CMD ["/bin/bash"] 

I uruchomić ten pojemnik z następującego polecenia

sudo docker run --link my-postgres:my-postgres -v /home/mpmsp/project/ezdict/ezbkend:/usr/src/app -name my-app -i -t my-app 

wyjście doker ps pokazuje, że pojemniki są połączone

NAMES 
my-app/my-postgres, my-postgres 

Jednak, gdy przejdę do localhost: 8000, widzę stronę błędu z Django, z następującym wynikiem:

OperationalError at /api-auth/login/ 
could not connect to server: Connection refused 
    Is the server running on host "127.0.0.1" and accepting 
    TCP/IP connections on port 5432? 
Request Method: GET 
Request URL: http://127.0.0.1:8000/api-auth/login/ 
Django Version: 1.6.4 
Exception Type: OperationalError 
Exception Value:  
could not connect to server: Connection refused 
    Is the server running on host "127.0.0.1" and accepting 
    TCP/IP connections on port 5432? 
Exception Location: /usr/local/lib/python3.4/site-packages/psycopg2/__init__.py in  connect, line 164 
Python Executable: /usr/local/bin/python 
Python Version: 3.4.1 
Python Path:  
['/usr/src/app', 
'/usr/local/lib/python34.zip', 
'/usr/local/lib/python3.4', 
'/usr/local/lib/python3.4/plat-linux', 
'/usr/local/lib/python3.4/lib-dynload', 
'/root/.local/lib/python3.4/site-packages', 
'/usr/local/lib/python3.4/site-packages'] 
Server time: Птн, 10 Окт 2014 12:07:07 +0400 

settings.py aplikacji

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': 'mydb',      
     'USER': 'postgres', 
     'PASSWORD': '', 
     'HOST': '127.0.0.1',      
     'PORT': '5432',      
    } 
    } 

Jak zrobić łącząc pracę? Dzięki z góry

Odpowiedz

14

Dockerfile dla Django obrazu nie powinna narażać portu 5432 jako NO serwera PostgreSQL zostanie uruchomiony w dowolnym pojemniku utworzonym z tego obrazu:

FROM python:3-onbuild 
EXPOSE 8000 
CMD ["/bin/bash"] 

następnie jako używasz pojemnik Django łącząc go z

--link my-postgres:my-postgres

ustawień dla bazy danych są nieprawidłowe.

W pojemniku Django: 127.0.0.1 odnosi się do pojemnika Django, który nie jest uruchomiony każdą usługę nasłuchuje na porcie 5432.

Więc plik settings.py powinno być:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': 'mydb',      
     'USER': 'postgres', 
     'PASSWORD': '', 
     'HOST': 'my-postgres',      
     'PORT': '5432',      
    } 
    } 

jako uruchomić swój pojemnik z Django:

sudo docker run --link my-postgres:db -v /home/mpmsp/project/ezdict/ezbkend:/usr/src/app -name my-app -i -t my-app

wówczas settings.py plik musiałby być:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': 'mydb',      
     'USER': 'postgres', 
     'PASSWORD': '', 
     'HOST': 'db',      
     'PORT': '5432',      
    } 
    } 
+3

Co znajduje się o db sync/migracji? Zdałem sobie sprawę, że nie mogę połączyć kontenera PostgreSQL na kompilacji, ale muszę zrobić syncdb i jakoś migrować przed uruchomieniem serwera django. – syabro

+0

, więc drugi argument (po dwukropku) w '--link my-postgres: [2nd arg]' staje się wartością klawisza 'HOST' w' domyślnych 'ustawieniach dotyczących' DATABASES'ów Django? – pkaramol

+0

tak, składnia to '--link : ' – Thomasleveil

0

Ths syncdb działa dopiero po obydwu pojemników db Django są budowane i zaczął, to można ręcznie uruchomić polecenie syncdb z figurą/Döcker-Compose/docker. myślę o tworzeniu miejsc pracy na i niech sam pojemnik uruchomić syncdb (i tworzenia użytkownika admin po syncdb - za stworzenie niezbędnych tabel)