Странное поведение dnsmasq в контейнерах докеров

У меня есть экземпляр CoreOS, на котором запущен док-контейнер, который запускает dnsmasq. В настоящее время конфигурация dnsmasq настроена только для регистрации всех запросов и запуска в режиме отладки, поэтому она должна просто выполнять кэширование.

Когда я пытаюсь использовать это из другого контейнера с dig, nslookup или просто запускаю ping google.com, я получаю обратно Bad hostname: google.com и вижу в запросе журнала, что запросы поступают несколько раз, как будто они повторяются.

Если я попытаюсь запустить те же команды с хост-компьютера под управлением CoreOS, все разрешится без проблем с одной попытки.

Мой план состоит в том, чтобы запустить dnsmasq на каждой машине с CoreOS в кластере и обеспечить его поддержку confd, чтобы все службы могли разрешать соответствующие аналоги.

Я использую Alpine linux для своих базовых образов, но я пытался запустить эти команды в образах Ubuntu и Debian с тем же результатом.


person Vasili Sviridov    schedule 28.03.2016    source источник
comment
чтобы все сервисы могли разрешать соответствующие дубликаты; имейте в виду, что Docker 1.9 позволяет вам напрямую разрешать другие контейнеры в той же сети через их имя. (например, ping other-container). Docker 1.10 имеет дополнительные улучшения для этого и позволяет вам устанавливать псевдонимы области действия контейнера и псевдонимы области действия сети для контейнеров.   -  person thaJeztah    schedule 28.03.2016
comment
Да, я знаю, однако, что это будет часть кластера CoreOS, поэтому я не уверен, как Docker будет передавать это на несколько хостов. Мы также планируем запустить CoreOS + Flannel, чтобы каждый контейнер получил маршрутизируемый IP-адрес, я думаю, что этот механизм также не входит в компетенцию Docker.   -  person Vasili Sviridov    schedule 29.03.2016
comment
Итак, я приближаюсь к ответу. Я прогнал nslookup через strace внутри одного из контейнеров, и одна строка была особенно интересной — reply from unexpected source: 172.17.42.1#53, expected 10.137.64.102#53 По сути, адрес 10. передается контейнеру как --dns. Но ответы приходят от сетевого адаптера docker хоста, поэтому он отбрасывается и повторяется. Когда я устанавливаю преобразователь в качестве IP-адреса во внутренней сети докеров, он работает нормально.   -  person Vasili Sviridov    schedule 29.03.2016


Ответы (1)


Правильная вещь присутствовала в следующем потоке (Настройка Docker Dnsmasq)

при выставлении порта он должен быть явно привязан к IP-адресу хоста (внутреннему, в нашем случае).

Вызов контейнера выглядит примерно так:

source /etc/environment
docker run -d --cap-add NET_ADMIN \
    -p "$COREOS_PRIVATE_IPV4:53:53" \
    -p "$COREOS_PRIVATE_IPV4:53:53/udp" \
    -e COREOS_PRIVATE_IPV4="$COREOS_PRIVATE_IPV4"\
    someorg/dnsmasq

Затем все контейнеры, которые запускаются с --dns "$COREOS_PRIVATE_IPV4", правильно разрешаются через dnsmasq на уровне машины.

person Vasili Sviridov    schedule 30.03.2016