Docker-compose для запуска django с mongodb

Я столкнулся с проблемой использования docker-compose, чтобы связать контейнер django с контейнерами postgres и mongo? Я пытаюсь использовать "docker-compose up", который запускает контейнеры mongo и postgres (поскольку мне нужно связать оба), но все же приложение django не может подключиться к mongodb по умолчанию. Содержимое файла django-compose.yml копируется ниже:

    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

Он соединяется с postgres с настройками по умолчанию. Я также могу использовать telnet для порта mongodb локально. Тем не менее, я получаю эту ошибку при запуске веб-контейнера:

Файл "/usr/local/lib/python2.7/site-packages/mongoengine/connection.py", строка 124, в get_connection web_1 | Поднять ConnectionError ( "Can not подключиться к базе данных% s:\n% s" % (псевдоним, e)) web_1 | mongoengine.connection.ConnectionError: невозможно подключиться к базе данных default: web_1 | [Errno 111] Соединение отклонено

PS: Я успешно подключил подключенное к django-postgres приложение на моем локальном хосте, но он не смог подключиться к db, на экземпляре AWS. Это еще одна проблема, которую мне еще нужно получить от root.

Ответ 1

У меня возникла аналогичная проблема, но с другой службой (а не с MongoDB). Я не уверен, что я делаю неправильно, но вот как я мог это решить:

import os
import mongoengine

MONGODB_HOST = os.environ.get('DB2_PORT_27017_TCP_ADDR', '127.0.0.1')
mongoengine.connect(host=MONGODB_HOST)
  • Если DB2 является именем вашей службы в файле docker-compose.yml
  • 27017 является портом открытой службы.
  • Подробнее о переменных среды-докере-компилятора
  • Я бы поместил это в свой файл настроек. Но вы можете свободно размещать его, если хотите, в зависимости от архитектуры вашего проекта.

UPDATE

Теперь контейнеры для компоновки докеров доступны другим службам с использованием имени хоста, похожего на их псевдоним. документация по ссылкам:

Контейнеры для связанной услуги будут доступны по имени узла идентичный псевдониму или имя службы, если не было указано псевдоним.

И таким образом вы можете подключиться к MongoDB следующим образом:

import mongoengine

mongoengine.connect(host="db2")

Ответ 2

Проблема, с которой вы сталкиваетесь, заключается в том, что контейнер приложения и контейнер БД запускаются независимо друг от друга, и что самое главное, контейнер приложения не будет ждать, пока контейнер БД не будет запущен. Существует так же, как докеры составляют 1.1.0 никакой функции, которая позволила бы учитывать такие зависимости.

Это хорошо известная проблема и уже обсуждалась . По-видимому, консенсус заключается в том, что это не должно решаться на уровне докера, а в самом докере. Уже существует предложение для работы в докере.

В моем случае я только что создал такой интеллект в самом приложении. Я проверяю подключение порта до успешного завершения, а затем запускаю остальную часть приложения.

Ответ 3

Вы должны указать имя хоста, как в файле компоновки докеры, вместо IP-адреса.

У меня возникли аналогичные проблемы при подключении от веб-приложения Tornado к Mongo DB. Вот мой docker-compose.yml:

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

Вот моя строка подключения:

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

Моя ошибка заключалась в том, чтобы указать IP-адрес вместо имени хоста (db), как в файле компоновки docker.

Ответ 4

Мне удалось контейнерить Django и MongoDB, подключить оба контейнера. Я использовал Dockerfiles для сборки обоих контейнеров и запуска докеров, чтобы запустить контейнеры и подключить их. Просто выполните шаги в этом repo. Мне было необходимо использовать Dockerfiles для большей мощности над установленными версиями необходимых библиотек, потому что последние версии Django и mongoengine несовместимы. Стабильные рабочие версии

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