Docker Swarm, как общаться с другими сервисами только через их "имя хоста"? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть некоторый опыт работы с Docker Compose и связыванием контейнеров.В среде без роя вы можете легко подключиться, например, из контейнера web к контейнеру db_mysql, используя его имя (например, в PHP я могу настроить соединение MySQL следующим образом:

$dsn = 'mysql:host=db_mysql;

Мне трудно понять, как это работает с Docker в режиме Swarm, особенно учитывая механизмы «реплики» и «балансировки нагрузки».

Допустим, у меня есть 5 разныхDocker Machines, каждый из которых имеет свой публичный IP-адрес, участвует в Swarm. У меня также есть служба web и служба db, которые реплицируются на эти 5 разных компьютеров (по 1 экземпляру на каждую машину).

Мой вопрос: как я могу сделать любой из контейнеров 5 web, связаться с любым из контейнеров 5 db_mysql, не заставляя эти контейнеры web знать какие-либо публичные IP-адреса Docker Machine или факт существования этих контейнероввнутри Роя?

1 Ответ

2 голосов
/ 07 марта 2019

Вы используете название сервиса.Это разрешит в DNS либо VIP, либо 5 IP-адресов (по одному для каждой реплики) службы.Под прикрытием VIP использует IPVS для округления до одной из исправных реплик, не страдая от устаревших проблем DNS.Вы также можете получить все IP-адреса реплики, используя service_name.tasks, даже если вы используете VIP по умолчанию.

В реализации Docker для DNS вы можете разрешить имя контейнера и любой сетевой псевдоним.Псевдоним сети включает имя службы с DNSRR (используется docker-compose без роя).Или имя службы превращается в VIP в режиме роя.Имя хоста контейнера не разрешается, вероятно, потому, что оно может измениться вне контроля (и, следовательно, знания) механизма докера.

...