Объявление вашего приложения из контейнера (докера) - программирование

Объявление вашего приложения из контейнера (докера)

Я задал этот вопрос в докере IRC за выходные, но мне пришлось уйти, прежде чем я подумал о ответах:

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Update

Проект maestro дает пример того, как контейнеры настроены извне, а затем запускается для настройки совместной сети контейнеров.

Ответ 2

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

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

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

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

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

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

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

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

Я написал некоторые из моих мыслей об этом.