2017-02-19 3 views
1

У меня есть приложение-узел, работающее в одном контейнере докера, база данных mongo на другом и база данных redis на третьем. В разработке я хочу работать с этими тремя контейнерами (не загрязняя мою систему установками базы данных), но в процессе производства я хочу, чтобы базы данных устанавливались локально и приложение в докере.Приложение Docker и база данных в разных контейнерах

Приложение предполагает, что базы данных работают на локальном хосте. Я знаю, что могу пересылать порты из контейнеров на хост, но могу ли я пересылать порты между контейнерами, чтобы приложение могло обращаться к базам данных? Переадресация портов теми же портами в разных контейнерах создает столкновение.

Я также знаю, что контейнеры будут находиться в одной и той же мостовой сети, и, используя команду «curl», я обнаружил, что они подключены, и я могу получить к ним доступ, используя их относительные IP-адреса. Однако я надеялся, что этот проект будет работать без изменения спецификации «localhost» в коде.

Есть ли способ переместить эти порты? Возможно, в файле dockerfile моего приложения с помощью iptables? Я хочу, чтобы контейнер моего приложения мог получить доступ к mongoDB, используя, например, «localhost: 27017», даже если они находятся в отдельных контейнерах.

Я использую Docker для Mac (V 1.13.1). В производстве мы будем использовать Docker на сервере Ubuntu.

Я немного нуб. Спасибо за помощь.

+0

Действительно ли это является «локальным ходом», или вы можете иметь «db: port» и «redis: port» для доступа к базам данных? Затем просто установите значения для 'db' и' redis' на основе настройки (например [доступ к локальному хосту машины] (http://stackoverflow.com/a/24326540/2127492)) – jrbeverly

+3

Вы можете сделать переменные среды для хранения этих адреса. – hya

+0

@ Ken Вы решили свою проблему? – Salem

ответ

1

Docker только позволяет отображать контейнерные порты для размещения портов (а не наоборот), но есть несколько способов для достижения этой цели:

  • Вы можете использовать --net=host, который сделает контейнер использовать хост вместо моста по умолчанию. Следует отметить, что это может вызвать некоторые проблемы с безопасностью (поскольку контейнер может потенциально обращаться к любой другой службе, которую вы запускаете на своем хосте) ...

  • Вы можете запустить что-то в своем контейнере, чтобы сопоставить локальный порт с удаленным портом (ex rinetd или туннель ssh). Это будет в основном создать отображение localhost:SOME_PORT ->HOST_IP_IN_DOCKER0:SOME_PORT

  • Как указано в комментариях, создать некоторый скрипт для извлечения IP-адрес (например: ifconfig docker0 | awk '/inet addr/{print substr($2,6)}'), а затем выставить это в качестве переменной среды. Предположив, что скрипт будет wrappen в команде с именем getip, вы можете запустить его следующим образом:

    $ docker run -e DOCKER_HOST=$(getip) ... 
    

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