2013-08-12 4 views
13

Я задал этот вопрос на docker's IRC в минувшие выходные, но должен был возглавить прежде чем я думал, что через ответы:Объявляя приложение внутри контейнера (докер)

Если у меня есть ряд приложений, выполняющихся в контейнерах (давайте, на данный момент, предположим, что все они работают на одном физическом оборудовании, но это не обязательно), и я хочу, чтобы каждый из них мог автоматически находить друг друга.

Используя какой-либо реестр (например, etcd или DNS-SD/Bonjour), вы можете объявить о своей услуге и любых соответствующих подробностях, а другие приложения узнают о них и трафике трафика соответственно.

Проблема заключается в том, что, хотя приложение может узнать, какое имя хоста/порт оно обслуживает на в пределах контейнера, это не обязательно должен быть порт или адрес, из которого он доступен. Есть два бита информации, которые должны быть соединились:

  • Где услуга может быть доступна; доступный снаружи контейнера
  • Что такое услуга (номер версии, вид обслуживания); доступный изнутри контейнера

Как бы вы порекомендовали мне получить эту информацию через контейнерный барьер?

  1. Я могу предоставить докер через TCP в контейнеры, поэтому приложение может запросить, где его показывать, но это, похоже, нарушает разделение проблем.
  2. Я мог бы открыть файл/порт в контейнере, который запрашивает хост-система после запуска контейнера для подготовки к анонсу, но это немного похоже на то, что я буду изобретать WSDL.

Любые мысли или рекомендации относительно того, как я должен решить эту проблему?

ответ

4

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

Update

maestro проект дает пример того, как контейнеры выполнены снаружи, а затем начали установить взаимодействующую сеть контейнеров.

+0

Это то, что я пытался (плохо) объяснить в том, что я теперь пронумеровал «2». Если я буду ждать, пока контейнер не будет запущен, я могу заставить хост-систему выполнить регистрацию, но тогда у меня нет единого способа определения * того, что * этот контейнер делает. (Информация, например, какая услуга (-ы) находится/находится в контейнере, и какие версии они не могут быть легко доступны). –

+2

@JP. Понятно, это проблема с курицей и яйцом. Я не думаю, что есть эффективный способ решения проблемы. Приложение в контейнере должно в идеале быть апатридом, позволяющим его развертывать несколько раз. Каждый экземпляр этого контейнера имеет разные номера портов, которые в конечном итоге определяются хост-системой. Я полагаю, докер - это инструмент для создания систем PAAS, а не PAAS сам по себе. –

+2

@JP. См. Ссылку на maestro –

3

У меня тоже были проблемы с этим. Я считаю, что ошибка в вашем мышлении состоит в том, что сам контейнер является единственным, кто знает, что он делает.

Контейнеры не являются самообучающимися объектами, которые сегодня обслуживают MySQL, и решили завтра стать процессором очереди.

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

Контролер знает, что необходим сервис MySQL, а служба MySQL представляет собой один хост: порт для подключения. В этом случае он также может знать, что услуга состоит из двух или трех портов.

Поэтому, для хоста/контроллера по архитектуре необходимо либо сообщить контейнер, с которым следует зарегистрировать адрес, или спросить его, какой локальный порт он обслуживает (или, более вероятно, знать порт на основе контейнер).

На практике хост может сказать, что контейнер «запустит вашу службу на интерфейсе LAN на этом конкретном порту, и я зарегистрирую его», «запустите службу самостоятельно на любом порту в этом интерфейсе локальной сети и зарегистрируйте ее самостоятельно» или «запустите свою службу на этом порту и зарегистрируйте ее с помощью порта host: и я настрою сопоставления, чтобы убедиться, что он доступен там».

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

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

У меня есть written up некоторые из моих мыслей об этом.

+1

Примером такого контроллера может быть OpenStack, который поддерживает Docker и может программно назначать IP-адреса для контейнеров Docker. – Tom

Смежные вопросы