2014-10-10 28 views
10

Tôi có hai vùng chứa Docker. Cái đầu tiên là container Postgresql, mà tôi chạy bằng lệnh sau đây.Liên kết Django và Postgresql với Docker

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 

Nó dựa trên official image và hoạt động hoàn hảo, tôi có thể kết nối với Postgresql từ máy chủ.

Vùng chứa thứ hai là vùng chứa với ứng dụng Django của tôi. Những hình ảnh được xây dựng bằng cách sử dụng Dockerfile sau (dựa trên this image):

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

Và tôi chạy chứa này với lệnh sau đây

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

Docker ps đầu ra cho thấy rằng container được liên kết

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

Tuy nhiên, khi tôi đi đến localhost: 8000, tôi thấy một trang lỗi từ Django, với đầu ra sau

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 của ứng dụng

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

Làm thế nào để làm cho liên kết làm việc? Cảm ơn trước

Trả lời

14

Các Dockerfile cho hình ảnh Django của bạn không nên tiếp xúc với cổng 5432 như không có máy chủ PostgreSQL sẽ được chạy trong bất kỳ container được tạo ra từ hình ảnh đó:

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

Sau đó, khi bạn đang chạy container Django liên kết nó với

--link my-postgres:my-postgres

cài đặt cho các cơ sở dữ liệu là không chính xác.

Trong container Django: 127.0.0.1 đề cập đến container Django mà không chạy bất kỳ dịch vụ lắng nghe trên cổng 5432.

Vì vậy, tập tin settings.py của bạn nên là:

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

Như bạn chạy chứa Django của bạn với:

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

sau đó settings.py của bạn tập tin sẽ phải là:

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

Đồng bộ hóa/di chuyển db là gì? Tôi nhận ra rằng tôi không thể liên kết container postgres trên xây dựng nhưng tôi cần phải làm syncdb và di chuyển bằng cách nào đó trước khi chạy máy chủ django. – syabro

+0

vì vậy đối số thứ hai (sau dấu hai chấm) trong '--link my-postgres: [2nd arg]' trở thành giá trị cho khóa 'HOST' trong các thiết lập' mặc định 'liên quan đến' DATABASES' của django? – pkaramol

+0

có, cú pháp là '--link : ' – Thomasleveil

0

Ths syncdb chỉ hoạt động sau khi cả hai container db và django được xây dựng và bắt đầu, sau đó bạn có thể chạy lệnh syncdb với vả/Docker-soạn/Docker. Tôi đang nghĩ đến việc tạo công việc AT và cho phép vùng chứa tự chạy syncdb (và tạo người dùng quản trị sau syncdb - để tạo các bảng cần thiết)

Các vấn đề liên quan