Ответ 1
ты блуждаешь по неизведанной территории! ☺
Здесь есть несколько подходов; и ни одна из них не идеальна, но ситуация улучшится в будущих версиях Docker благодаря крючкам оркестровки.
Один из способов - использовать хорошее старое обнаружение и регистрацию службы. I.E., когда начинается сервис, он будет определять свой общедоступный адрес и зарегистрировать себя, например. Zookeeper, Etcd или даже Redis. Поскольку для службы не является обычным для определения своего общедоступного адреса (если вы не примете некоторые соглашения, например, всегда сопоставляя порт X: X, а не позволяя Docker осваивать случайные порты), вы можете захотеть сделать регистрацию извне. Это означает, что ваш уровень оркестровки (в этом случае Mesos) запустит контейнер, затем определит хост и порт и поместит его в вашу систему обнаружения сервисов. Я не очень знаком с марафоном, но вы должны иметь возможность зарегистрировать для этого крючок. Затем другие контейнеры будут просто искать адрес конечной точки в реестре обнаружения служб, простой и простой.
Вы также можете посмотреть Skydock, который автоматически регистрирует имена DNS для ваших контейнеров с помощью Skydns. Тем не менее, он в настоящее время является одним хостом, поэтому, если вам нравится эта идея, вам придется каким-то образом расширить его, чтобы поддерживать несколько хостов и, возможно, записи SRV.
Другой подход - использовать "хорошо известные точки входа". Это на самом деле упрощенный пример обнаружения службы. Это означает, что вы убедитесь, что ваши службы будут всегда выполняться на предварительно установленных хостах и портах, чтобы вы могли использовать эти адреса статически. Конечно, это плохо (потому что это сделает вашу жизнь тяжелее, когда вы захотите воспроизвести среду для целей тестирования/постановки), но если у вас нет никакой подсказки об обнаружении службы, ну, это может быть начало.
Вы также можете использовать Pipework для создания одной (или нескольких) виртуальной сети, охватывающей несколько хостов, и связывания ваших контейнеров вместе. Pipework позволит вам назначать IP-адреса вручную или автоматически через DHCP. Однако этот подход не рекомендуется, но он подходит, если вы также хотите подключить свои контейнеры к существующей сетевой архитектуре (например, VLAN...).
Независимо от того, какое решение вы решите использовать, я настоятельно рекомендую "притворяться", что вы используете ссылки. То есть вместо жесткого кодирования вашей конфигурации приложения для подключения к (случайному примеру) my-postgresql-db:5432
используйте переменные среды DB_PORT_5432_TCP_ADDR
и DB_PORT_5432_TCP_PORT
(как если бы это была ссылка) и установите эти переменные при запуске контейнера. Таким образом, если вы "сворачиваете" свои контейнеры в более простую среду без обнаружения сервисов и т.д., Вы можете легко отступать на ссылки без усилий.