3

У меня есть хост-консул, работающий на моей хост-машине, и несколько сервисов, работающих в док-контейнерах. Я использую 'gliderlabs/registrator', чтобы обнаружить эти службы и зарегистрировать их у местного агента консула.

Агент консула настроен на прием подключений отовсюду ("client_addr": "0.0.0.0" ), что я могу "доказать", выполнив dig @172.17.42.1 -p 8600 someservice.service.consul с хост-машины.

Проблема в том, что я, кажется, не могу сделать то же самое из контейнеров, запрос на копирование просто истекает, и я тоже не могу его curl . Я --dns 172.17.42.1 . Есть идеи?

Примечание: я хочу по возможности избегать использования --net=host .

Спасибо!

1 ответ1

3

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

Я также против использования --net=host !!!.

То, что заставило это работать в моем случае, было:

a) Я создал config.json для Consul, и внутри него я настроил свойство ports.dsn для использования порта 53 (по умолчанию DNS).

Вы не можете использовать 8600 внутри контейнеров Docker, это потому, что аргумент docker run --dns не позволяет вам указать порт.

б) Я использовал LAN (частный) IP хоста в качестве значения --dns . Я пробовал с другими значениями ранее (0.0.0.0 , публичный IP и 127.0.0.1), но они не работали.

c) Необязательно: Вы можете добавить --dns-search="service.consul" к docker run чтобы иметь более короткие доменные имена (т.е. избежать необходимости писать часть service.consul ).

Оказавшись внутри контейнера, вы можете выполнить nslookup ubuntu.service.consul при условии, что это имя службы у вас есть для этого контейнера.

Важные замечания:

  • Вам нужно выставить порты (т. Е. Флаг -P или -p ) на контейнере, чтобы registrator мог их забрать. Если вы не используете порт совместно, registrator будет молча игнорировать контейнер.
  • Хорошо настроить имя хоста (используя флаг -h ).

Надеюсь это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .