Не удается определить имя хоста из другого контейнера Docker в той же сети - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть дб и серверный контейнер, оба работают в одной сети. Может без проблем проверить связь с хостом БД по его идентификатору контейнера. Когда я вручную установил имя хоста для контейнера db (-h myname), это имело эффект ($ hostname возвращает установленный хост), но я не могу пропинговать это имя хоста из другого контейнера в той же сети. Идентификатор контейнера все еще проверяется. Хотя это работает без проблем в докере. Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Я обнаружил, что эту проблему можно решить без сети, используя - опция add-host . IP-адрес контейнера можно получить , используя команду inspect .

Но когда контейнеры находятся в одной и той же сети, они могут обращаться друг к другу через свои имена.

0 голосов
/ 21 ноября 2018

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

  • идентификатор контейнера
  • имя контейнера
  • любые сетевые псевдонимы, которые вы определяете для контейнера в этой сети

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

Вы должны быть в сети, созданной пользователем, а не чем-то вроде моста по умолчанию, у которого отключен DNS. Это делается по умолчанию при запуске контейнеров с составным файлом.

Избегайте использования ссылок, поскольку они устарели. И я бы рекомендовал добавлять записи узлов только для внешних статических узлов, которых нет ни в одном DNS, ни для контейнера в контейнер, ни для доступа к другим узлам вне докера, DNS предпочтительнее.

0 голосов
/ 18 ноября 2018

Как указано в документации докера , если вы запускаете контейнеры в мостовой сети по умолчанию , добавление -h myname добавит эту информацию к

  • / и т.д. / хосты
  • / и т.д. / resolv.conf
  • и приглашение bash

контейнера только началось.

Однако это не повлияет на другие независимые контейнеры. (Вы можете использовать --link для добавления этой информации в / etc / hosts других контейнеров. Однако --link устарело.)

С другой стороны, когда вы создаете определяемую пользователем мостовую сеть , docker предоставляет встроенный DNS-сервер, чтобы сделать возможным поиск имен между контейнерами в этой сети, см. Встроенный DNS-сервер в пользователе сети . Разрешение имен принимает имена контейнеров, определенные с --name. (Вы не найдет другой контейнер, используя его значение --hostname.

Причина, по которой он работает с docker-compose, заключается в том, что docker-compose создает собственную сеть и автоматически называет контейнеры.


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

Если вы не назначаете имя контейнера с параметром --name, тогда демон генерирует случайное имя строки для вас. [...] Если вы укажете имя, вы можете использовать его при обращении к контейнеру в сети Docker.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...