Связывание Django и Postgresql с Docker

У меня есть два контейнера Docker. Первый - это контейнер Postgresql, который я запускаю с помощью следующей команды.

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

Он основан на официальном изображении и работает отлично, я могу подключиться к Postgresql от хоста.

Второй контейнер представляет собой контейнер с моим приложением Django. Изображение построено с использованием следующего файла Docker (на основе этого изображения):

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

И я запускаю этот контейнер со следующей командой

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 показывает, что контейнеры связаны

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

Однако, когда я перехожу к localhost: 8000, я вижу страницу ошибок из Django со следующим выходом

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

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

Как сделать ссылку? Спасибо заранее

Ответ 1

Файл Docker для вашего изображения Django не должен выставлять порт 5432, поскольку сервер Postgresql не будет запущен в любом контейнере, созданном с этого образа:

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

Затем, когда вы запускаете контейнер Django, связывающий его с

--link my-postgres:my-postgres

Ваши настройки для базы данных неверны.

В контейнере Django: 127.0.0.1 относится к контейнеру Django, в котором не работает служба, прослушивающая порт 5432.

Итак, ваш файл settings.py должен быть:

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

Когда вы запускаете свой контейнер Django с помощью:

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

то ваш файл settings.py должен быть:

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

Ответ 2

Ths syncdb работает только после того, как будут созданы и запущены обе контейнеры db и django, затем вы можете вручную запустить команду syncdb с помощью fig/docker-compose/docker. Я собираюсь создать AT-задание и позволить контейнеру запускать сам syncdb (и создать пользователя admin после syncdb - для создания необходимых таблиц)