docker.io DNS не работает, он пытается использовать 8.8.8.8

Я имею новую установку Ubuntu 14.04 и хочу использовать Докера для выполнения моего старого материала, которому нужно 12.04. DNS внутренний Докер не работает.

resolv.conf моего ноутбука похож:

nameserver 127.0.0.1

Который не работает с Докером, по-видимому. Это поэтому пытается установить серверы имен на 8.8.8.8 и 8.8.4.4; когда я делаю

$ sudo docker run -i -t ubuntu /bin/bash

Это говорит:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

И конечно же, в экземпляре Докера, resolv.conf похож:

nameserver 8.8.8.8
nameserver 8.8.4.4

Я могу проверить с помощью ping-запросов обоих из тех, которые успешно из экземпляра Докера. Однако нет никакого DNS (например, ping google.com сбои).

вывод ifconfig внутренний Докер:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Теперь, что?

33
задан 2 June 2014 в 07:12

6 ответов

Когда пакет Докера Ubuntu обновил к использованию systemd, это отбросило поддержку /etc/default/docker файл конфигурации, таким образом, начальное решение, предложенное rocketman10404, больше не будет работать (отключение dnsmasq все еще работал бы, но это имеет оборотную сторону предотвращения Ubuntu от автоматического обновления сервера DNS).

Фиксация в новом daemon.json файл конфигурации

Найдите сервер DNS своей сети:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Откройте или создайте, если это не существует, /etc/docker/daemon.json и добавьте настройки DNS к ExecStart строка:

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Перезапустите демона докера:

$ sudo service docker restart

Я записал всестороннее сообщение в блоге и также зарегистрировал ошибку об этой проблеме, если Вы хотели бы больше деталей.

(Первоначально я решил его путем открытия/lib/systemd/system/docker.service, и добавьте настройки DNS к строке ExecStart, но это плохо - мы не должны редактировать systemd файлы непосредственно.)

23
ответ дан 23 November 2019 в 00:34

Я не использую докера сам, таким образом, я обычно не бодал бы - в здесь по вопросу о докере, но я просто, оказалось, читал об этом и наткнулся на некоторую документацию докера, которая, кажется, решает эту точную проблему. Суммировать...

Документация предлагает несколько обходных решений. Первое должно указать сервер DNS, который будет использоваться демоном докера для контейнеров путем добавления следующей строки к /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

где обеспеченный DNS мог быть локальным сервером DNS, такой как 192.168.1.1 (шлюз). Затем перезапустите с

sudo restart docker

Альтернативное решение привлекает отключение dnsmasq в NetworkManager путем комментирования конфигурации в /etc/NetworkManager/NetworkManager.conf как так:

#dns=dnsmasq

затем, перезапустите обоих

sudo restart network-manager
sudo restart docker
16
ответ дан 23 November 2019 в 00:34

Вот то, как я настроил докера на своем сервере Ubuntu 14.04, работающем бездисплейный.

Я выполняю сервер Ubuntu 14.04 со следующей установленной версией докера.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

Файл/etc/init/docker.io.conf и сценарий содержат следующую строку:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

Ответ выше помог мне найти файл выше.

Я непрокомментированный следующее в/etc/default/docker.io и добавил свой локальный сервер DNS:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

Перезапущенный сервис с:

sudo service docker.io restart

Работал docker run <image> /bin/bash

Никакие сообщения DNS при запуске контейнера.

Запущенный новый контейнер, установленный dnsutils.

Работал роют, и сообщение сервера является корректным локальным сервером DNS.

2
ответ дан 23 November 2019 в 00:34

У меня была подобная проблема, сообщила она StackOverflow. Кажется, что я не мог запросить 8.8.8.8 сервер имен, который указан в установке Ubuntu по умолчанию Докера; однако, я мог проверить с помощью ping-запросов его. В этом случае используйте сервер DNS, который можно на самом деле запросить. Тест с

nslookup - dns.server.name

и запустите контейнер через

docker run --dns=ip.addr.of.dns

Я должен все же найти, что путь к https://askubuntu.com/q/607172/30266 получает автоволшебное решение.

0
ответ дан 23 November 2019 в 00:34

Я столкнулся с этим в своей ситуации, которая является конкретно

  • Выполнение контейнеров Докера на моей локальной машине разработки
  • Который подключен к VPN
  • Некоторые наши контейнерные сценарии сборки делают вещам нравится выполненный npm install из пользовательского репозитория на VPN, в контейнере.
    • Это работает от конвейера CI, но не от наших машин разработчика, потому что npm не может сделать успешного поиска DNS
    • У нас также были проблемы с контейнерами, которые должны сделать поиски для вызова внешних API REST

Ubuntu использованием по умолчанию dnsmasq запущенный NetworkManager для кэширования запросов DNS, и настраивает /etc/resolv.conf указать на этот экземпляр на 127.0.1.1

  • Клиент VPN, которого мы используем, не является совместимым NetworkManager и вызывает свой собственный /etc/resolv.conf который перезаписывает конфигурацию NetworkManager
  • Это настраивает серверы DNS для VPN
  • Тени докера Ваш /etc/resolv.conf к контейнеру по умолчанию
    • Обычно на Ubuntu, это передает серверы Google DNS контейнеру (потому что это знает о dnsmasq ситуация.
    • Но радо передать конфигурацию сервера DNS VPN контейнеру
    • Нет никакого маршрута от контейнера на docker0 сетевой мост, к серверам DNS по VPN tap0 адаптер.
  • Следовательно, все поиски DNS в контейнерном сбое, потому что это не может достигнуть единственных серверов DNS, которыми это предоставляется
  • Кроме того, некоторый блок сетей запрашивает к серверам Google DNS, потому что они хотят смочь отследить все Ваши поиски DNS

Решение:

Это, казалось бы, было бы более изящным для использования NetworkManager, и это присоединено dnsmasq экземпляр в пути это было разработано.

  1. Скажите Докеру использовать Ваш dnsmasq экземпляр для DNS

    • Добавьте или отредактируйте файл /etc/docker/daemon.json сказать докеру использовать docker0 адаптер моста для DNS

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Настройте NM dnsmasq экземпляр для слушания мостов Докера также, потому что по умолчанию это только слушает 127.0.1.1 - создает файл /etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Мне не нравится грубое поведение того клиента VPN, и я довольно только использовал бы DNS в конце VPN для поисков VPN (если у Вас есть вежливый клиент VPN, который использует NetworkManager, настроенный правильно, Вы не должны будете делать этого),

    • Выключите функцию DNS в клиенте VPN (это прекращает перезаписывать resolv.conf на подключении и теперь весь DNS проходит dnsmasq снова)
    • Добавьте файл конфигурации для сообщения dnsmasq к прямым запросам DNS для Вашего домена соответственно - добавляют файл '/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Дополнительно, добавьте область поиска для своего домена, таким образом, можно использовать краткие названия

      • Я просто добавил наш локальный домен к поисковому списку в моем соединении стандартной сети
  4. Перезапустите NetworkManager и докера

    sudo service network-manager restart
    sudo service docker restart
    

В этой точке Ваши контейнеры Докера должны смочь сделать nslookup без проблем, когда Вы находитесь на VPN для доменов как внутри, так и снаружи Вашей VPN.

9
ответ дан 23 November 2019 в 00:34

Можно использовать локальный сопоставитель DNS хоста (например. dnsmasq) от Ваших контейнеров Докера, если они находятся в определяемой пользователем сети. В этом случае контейнер /etc/resolv.conf будет иметь сервер имен 127.0.0.11 (иначе встроенный сервер DNS Докера), который может передать запросы DNS петлевому адресу хоста правильно.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

Если Вы используете docker-compose, это настроит пользовательскую сеть для Ваших контейнеров автоматически (с форматом файла v2 +). Отметьте, однако, это в то время как docker-compose контейнеры выполнений в пользовательской сети, это все еще создает их в стандартной сети. Для использования пользовательской сети для сборок, можно указать network параметр в конфигурации сборки (требует формата файла v3.4 +).

0
ответ дан 23 November 2019 в 00:34

Другие вопросы по тегам:

Похожие вопросы: