Как скрыть контейнеры Docker за одним именем хоста

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

Самой большой проблемой было понимание того, как работает сеть. Я пытаюсь использовать Docker для запуска нескольких служб на машине, для которой требуются одни и те же порты, чтобы избежать конфликтов портов.

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

Проблема в том, что когда я пытаюсь получить доступ к службам из своего браузера, он перенаправляется на полное доменное имя контейнера, которое не может разрешить. Результат - ошибка "Сервер не найден".

Есть ли способ скрыть все контейнеры за полным доменным именем узла без необходимости разрешать полные доменные имена контейнеров?


person orodbhen    schedule 22.01.2015    source источник
comment
рассматривали ли вы прокси ?   -  person Mykola Gurov    schedule 22.01.2015
comment
Я попытался использовать обратный прокси-сервер Apache, работающий на хосте (CentOS 7). Возможно, я неправильно настроил, но это не сработало. Он по-прежнему перенаправляет на имя хоста контейнеров. Насколько я понимаю, ProxyPassReverse http://‹container-fqdn›:‹port› должен предотвращать отображение перенаправлений в браузере, но я вижу там адрес контейнера. Кроме того, кажется, нет способа дать контейнеру статический адрес, что затрудняет настройку прокси.   -  person orodbhen    schedule 23.01.2015


Ответы (1)


Вы можете заставить каждый контейнер докера использовать другой внешний порт, а затем иметь серверный докер с чем-то вроде nginx или apache, который проксирует запросы обратно. Мне пришлось создать что-то вроде этого, которое принимает все на одно имя хоста, а затем пропускает весь трафик к соответствующему контейнеру и порту.

Сложность заключается в том, что контейнеры докеров имеют новые адреса каждый раз, когда они создаются. Вы можете динамически определить их адреса, когда они запускаются, и прокси-контейнер будет запускаться последним с этими адресами. Вы можете получить эти адреса с помощью «проверки докеров» и awk нужных вам данных, или вы можете использовать одну из этих библиотек, например docker-py, для получения соответствующих данных.

person jchysk    schedule 23.01.2015
comment
Кажется, должен быть более элегантный способ управлять этим, помимо необходимости каждый раз выяснять IP. Я подумал о привязке петлевого IP-адреса к открытым портам контейнера. Тогда Apache или Nginx могли бы пересылать запросы на этот адрес. Должен быть способ, которым это должно быть сделано. - person orodbhen; 23.01.2015
comment
Кажется, ответ находится здесь. Я надеялся на простое решение с использованием традиционных сетевых методов. Но, похоже, мне придется много читать :). - person orodbhen; 23.01.2015
comment
Если вы пытаетесь получить доступ к своим контейнерам из других контейнеров, правильным ответом будет связывание. --link memcached1:mc свяжет ваш контейнер с именем memcached1 с именем хоста «mc» внутри контейнера Docker, который вы запускаете. - person jchysk; 23.01.2015