2016-08-11 5 views
3

Я пытаюсь понять проблему с идентичными контейнерами докеров, которые запускаются на разных хостах, где один контейнер может найти/ping/nslookup для домена в частной сети и другой не может. Один хост - OSX 10.11, другой - Ubuntu 16.04. Оба запускают докер 1.12. Я использую docker-compose, чтобы открыть приложение, и я надеюсь выяснить, что происходит и как его исправить, или некоторые изменения конфигурации, которые я мог бы сделать, не прибегая к доменам жесткого кодирования или IP-адресам, которые заставили бы контейнер вести себя то же самое на обоих хостах.Docker: контейнер не может найти домен в частной сети

На моем OSX поля, у меня есть следующие неймсерверы DNS установлен автоматически мой домен:

osx:$ cat /etc/resolv.conf 
domain redacted.lan 
nameserver 172.16.20.19 
nameserver 10.43.0.11 

Я знаю, что resolv.conf не используется большинство инструментов OSX, но Системные настройки> Сеть показывает те же настройки.

У меня есть аналогичные настройки на моей Ubuntu 16 коробки, а также (команда из https://askubuntu.com/questions/152593/command-line-to-list-dns-servers-used-by-my-system):

ubu:$ cat /etc/resolv.conf 
nameserver 127.0.1.1 
search redacted.lan 

ubu:$ nmcli device show eno1 | grep IP4.DNS 
IP4.DNS[1]:        172.16.20.19 
IP4.DNS[2]:        10.43.0.11 

Тогда как на OSX и Ubuntu, я начинаю свой контейнер с этим:

$ docker run -it redacted_web bash 

И затем я запускаю эти команды для диагностики моей проблемы:

$ apt-get update 
$ apt-get install -y dnsutils 
$ cat /etc/resolv.conf 
$ nslookup redacted.lan 

На OSX, выход из последних 2-х команд:

[email protected]:/app# cat /etc/resolv.conf 
search local 
nameserver 192.168.65.1 
[email protected]:/app# nslookup redacted.lan 
Server:  192.168.65.1 
Address: 192.168.65.1#53 

Name: redacted.lan 
Address: 172.18.0.23 

В Ubuntu, выход:

[email protected]:/app# cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) 
#  DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN 
search redacted.lan 

nameserver 8.8.8.8 
nameserver 8.8.4.4 
[email protected]:/app# nslookup redacted.lan 
Server:  8.8.8.8 
Address: 8.8.8.8#53 

** server can't find redacted.lan: NXDOMAIN 

Возможные различия я могу думать:

  • На OSX есть является vm, работающим докере, где, как и на ubuntu, является родным
  • На Ubuntu докер запускается с sudo, возможно, собирает различные настройки конфигурации s
+0

У меня такая же проблема. Очень хорошо написанное описание проблемы. Позор, пока еще нет простого исправления, кроме отключения dnsmasq. – mkasberg

ответ

1

Проверьте скрипты запуска для Docker демона, он включает в себя следующие опции для настройки DNS, используемой при создании контейнеров:

$ dockerd --help 
# ... 
    --dns=[]         DNS server to use 
    --dns-opt=[]        DNS options to use 
    --dns-search=[]       DNS search domains to use 

На Ubuntu, я считаю, что эти параметры находятся в/и т.д./по умолчанию/docker, который читается /etc/init.d/docker. Если оставить эти unset, по умолчанию должны быть установлены значения /etc/resolv.conf.


Update: Docker's DNS networking документация имеет много деталей, которые должны указывать вам в правильном направлении.

, если нет больше записей сервера имен остались в файле /etc/resolv.conf контейнера, демон добавляет публичные DNS сервера имен Google (8.8.8.8 и 8.8.4.4) для конфигурации DNS-контейнера.

Похоже, что это, вероятно, происходит в вашей ситуации.Фильтры ищут локальные адреса, которые я бы не думал, что происходит в вашей ситуации с приватным добавлением 172.16.0.0/12, но это возможно.

Вы можете задаться вопросом, что произойдет, если файл /etc/resolv.conf главного компьютера изменен. У демона докера активирован уведомитель об изменении файла , который будет следить за изменениями в конфигурации DNS хоста.

Примечание: уведомитель об изменении файла использует функцию inotify Linux . Поскольку эта функция в настоящее время несовместима с драйвером файловой системы оверлея , демон Docker с использованием «overlay» не будет , способным воспользоваться функцией автоматического обновления /etc/resolv.conf.

Если это происходит, то давая демон рестарт, вероятно, разрешить его и будет означать, что вы хотите, чтобы начать Docker после NetworkManager.


Update # 2: глядя на this github issue вполне возможно, что они также включены 172.16.0.0/12, чтобы избежать конфликтов с мостиком сетей Docker в. Если вы можете быть уверены, что не используете одну и ту же сеть внутри докеров, передача dns-сервера в/etc/defaults/docker, скорее всего, приведет к правильному поведению. В конце сообщения также упоминается о lxc, вызывающем конфликты, поэтому, если у вас есть установленный и его можно удалить, попробуйте сначала.

+0

По умолчанию не применяются настройки: '$ cat/etc/default/docker # Используйте DOCKER_OPTS для изменения параметров запуска демона. #DOCKER_OPTS = "- dns 8.8.8.8 --dns 8.8.4.4" ' Все настройки закомментированы. – davethegr8

+1

Последующие изменения: может ли это быть фактической ошибкой докера? Моя установка Ubuntu не входит в комплект поставки 16.04, и кажется, что сервер имен 127.0.1.1 является экземпляром 'dnsmasq', поэтому, если он был добавлен где-то между 14 и 16, а докер фильтрует' 127.' nameserver, это означает что поведение по умолчанию для Ubuntu 16 не работает с док-станцией по умолчанию. – davethegr8

+0

Я не знаю, подумают ли они об этом с Docker, возможно, с пакетом Docker Ubuntu. Должно быть легко работать с некоторой дополнительной конфигурацией, либо самостоятельно, либо пакетом Ubuntu. – BMitch

3

Обновлено Ответ (2017-06-20)

Новые версии Ubuntu (17.04+) не используют Dnsmasq (теперь используется Systemd с разрешением). У вас возникнет аналогичная проблема с разрешением хоста, но исходное решение здесь больше не работает. Фактически, контейнеры Docker не могут даже связываться с systemd-resolvd, поскольку он запускает собственный DNS в недоступном для него месте в контейнере.

Хорошее решение на более новые версии Ubuntu, чтобы положить следующую конфигурацию в /etc/docker/daemon.json (создайте этот файл, если он не существует):

{ 
    "dns": ["172.16.20.19", "10.43.0.11"], 
    "dns-search": ["redacted.lan"] 
} 

Это позволяет настроить DNS-сервера и домены поиска , IP-адреса DNS выше из исходного вопроса, но вы также можете использовать свои собственные. Вероятно, вы захотите сопоставить конфигурацию DNS на своем хост-компьютере. Домен поиска не является обязательным, и вы можете полностью опустить эту строку (осторожно с запятыми!). Опять же, вы, вероятно, захотите сопоставить свой хост-компьютер.

По существу, что делают эти параметры daemon.json, автоматически встраивает конфигурацию DNS и поиск домена в файлы конфигурации внутри контейнера для любого контейнера, который запускается на этом демоне. Это необходимо, потому что вы не можете использовать systemd-разрешение от хоста для разрешения DNS в контейнере из-за ограничений способа работы с системным разрешением. Документы: here и here.


Оригинал ответа

Проблема заключается в том, что хост использует Dnsmasq для разрешения частного IP и Docker не использует Dnsmasq на хосте.

Простое исправление: отключить dnsmasq на главной машине.

  1. Run sudo vi /etc/NetworkManager/NetworkManager.conf
  2. Комментарий эту строку: #dns=dnsmasq
  3. Run sudo service network-manager restart

Теперь, вы должны быть в состоянии использовать контейнер Докер, и он будет правильно решить вашу приватную DNS.

Смежные вопросы