Контейнеры Docker не могут разрешить DNS на рабочем столе Ubuntu 14.04


48

У меня проблема с моими контейнерами Docker на Ubuntu 14.04 LTS. Docker работал нормально в течение двух дней, а затем внезапно я потерял все сетевое соединение внутри своих контейнеров. Вывод ошибки ниже первоначально привел меня к мысли, что это произошло потому, что apt-get пытается разрешить DNS через IPv6.

Я отключил IPv6 на своем хост-компьютере и все еще, удалил все образы, вытащил базовую Ubuntu и все еще столкнулся с проблемой.

Я изменил свои серверы имен /etc/resolve.conf со своего локального DNS-сервера на общедоступные DNS-серверы Google (8.8.8.8 и 8.8.4.4), но все еще не повезло. Я также установил DNS для Google в DOCKER_OPTS / etc / default / docker и перезапустил docker.

Я также попытался вытащить coreos, и yum также не смог разрешить DNS.

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

Я не за прокси, я в очень стандартной локальной сети, и эта версия Ubuntu актуальна и свежа (я установил два дня назад, чтобы быть ближе к докеру).

Я тщательно исследовал это в других статьях по stackoverflow и github, но не нашел решения. У меня нет идей относительно того, как решить эту проблему, кто-нибудь может помочь?

Сообщение об ошибке

➜  arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Контейнер IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.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:65536  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)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

Кроме того, обновление apt-get завершается неудачно, когда я запускаю IPv4:

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  

Для меня это сработало после перезагрузки.
ssi-anik

Ответы:


64

Ву, я нашел пост на github, который решил мою проблему.

После того, как Стив К. указал, что это на самом деле не проблема DNS, а проблема с подключением, я смог найти сообщение на github, в котором описывалось, как решить эту проблему.

Видимо, сетевой мост docker0 завис. Установка bridge-utils и запуск следующего привели мой Docker в рабочее состояние:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

1
Вам не нужно повторно оформлять свои изображения. resolv.conf генерируется каждый раз, когда вы запускаете новый контейнер. поэтому вам нужно удалить старый контейнер и запустить другой. Я был обеспокоен этой проблемой вчера. также, если вы находитесь в корпоративной интрасети, вы можете передать --dns-search = your.company.domain демону docker в / etc / default / docker в переменной env DOCKER_OPTS рядом с флагами --dns --dns.
Александр.

Это также исправило мои проблемы с докером.
BobMcGee

3
На арке линукс мне нужно было ip link set down docker0вместо ifconfig docker0 downи systemctl restart dockerвместо service docker start. Чтобы удалить все изображения, я сделалdocker rmi $(docker images -q)
меш

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

1
Просто увидел, что мой интерфейс docker0 не работает, я выполнил, /etc/init.d/docker restartи он вернулся к делу
lolesque

14

Если это проблема распознавателя DNS, вот решение:

Первое, что нужно проверить, - запустить cat /etc/resolv.confв контейнере Docker . Если он имеет недопустимый DNS-сервер, например nameserver 127.0.x.x, контейнер не сможет преобразовать доменные имена в IP-адреса, поэтому ping google.comпроизойдет сбой.

Второе, что нужно проверить, - запустить cat /etc/resolv.confна хост-компьютере . Docker в основном копирует хост /etc/resolv.confв контейнер при каждом запуске контейнера. Так что, если хост /etc/resolv.confневерен, то и контейнер докеров.

Если вы обнаружили, что хост /etc/resolv.confневерен, то у вас есть 2 варианта:

  1. Жесткий код DNS-сервера в daemon.json. Это легко, но не идеально, если вы ожидаете изменения DNS-сервера.

  2. Починить хозяев /etc/resolv.conf. Это немного сложнее, но генерируется динамически, и вы не программируете DNS-сервер.


1. Жесткий код DNS-сервера в Docker Daemon.json

  • редактировать /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Перезапустите демон docker, чтобы эти изменения вступили в силу:
    sudo systemctl restart docker

  • Теперь, когда вы запускаете / запускаете контейнер, докер будет заполняться /etc/resolv.confзначениями из daemon.json.


2. Исправить хозяев /etc/resolv.conf

A. Ubuntu 16.04 и ранее

  • Для Ubuntu 16.04 и более ранних версий /etc/resolv.confбыл динамически сгенерирован NetworkManager.

  • Закомментируйте строку dns=dnsmasq#) в /etc/NetworkManager/NetworkManager.conf

  • Перезапустите NetworkManager для регенерации /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Проверьте на хосте: cat /etc/resolv.conf

Б. Убунту 18.04 и позже

  • Ubuntu 18.04 изменено для использования systemd-resolvedдля генерации/etc/resolv.conf . Теперь по умолчанию он использует локальный кеш DNS 127.0.0.53. Это не будет работать внутри контейнера, поэтому Docker по умолчанию будет использовать DNS-сервер Google 8.8.8.8, который может сломаться для людей за брандмауэром.

  • /etc/resolv.confна самом деле это символическая ссылка ( ls -l /etc/resolv.conf), которая /run/systemd/resolve/stub-resolv.confпо умолчанию указывает на (127.0.0.53) в Ubuntu 18.04.

  • Просто измените символическую ссылку, на /run/systemd/resolve/resolv.confкоторую указывает реальный DNS-сервер:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Проверьте на хосте: cat /etc/resolv.conf

Теперь у вас должен быть действующий /etc/resolv.confна хосте докер для копирования в контейнеры.


Спасибо за это, я действительно сходил с ума, пытаясь понять, что происходит с докерными контейнерами и разрешением IP 18.04 в VPN. Исправление /etc/resolv.conf для 18.04 работало для меня!
Джордж Папас

вариант B работал для меня ..
CodeSetter

Конечно, 2B не переживет обновление systemdпакета ...
Auspex

13

В попытке добавить дополнительную ценность к проблеме, которую я также испытал; с альтернативным ответом:

Моя сеть была связана с офисом, и настройки DNS Google были заблокированы, чтобы контейнер мог пропинговать IP-адреса, но не доменные имена.

Мой хозяин /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
nameserver 127.0.1.1
search companyDomain.co.za

Это связано с тем, что Network Manager выполняет некоторую маскировку данных DNS-сервера.

К сожалению, согласно руководствам докера docker будет отфильтровывать любые локальные IP-адреса при сборке контейнера resolv.conf и заменять их DNS-IP-адресами Google. Что в моем случае привело к запрету доменных имен.

Мне пришлось:

  • Сбросьте мои /etc/default/dockerзначения по умолчанию, чтобы вместо них контейнеры использовали содержимое resolv.conf моего хоста.
  • Отредактируйте /etc/NetworkManager/NetworManager.confи закомментируйте строку dns=dnsmasq. Это необходимо для того, чтобы NM мог указывать фактические IP-адреса DNS вместо 127.0.0.1.
  • Перезагрузите NM с помощью sudo service network-manager restart.
  • Перезапустите службу Docker с помощью sudo service docker restart.

apt-get update/upgradeНапример, запуск контейнера позволил бы ему это сделать .


3
Это на самом деле работает для меня. И я был за интранетом компании
Даниэль Андрей Минкэ

1
Это решение прекрасно работает для Ubuntu 16.04 и более ранних версий. Для Ubuntu 18.04 и более поздних версий
wisbucky

Спасибо! Это сработало, а принятый ответ - нет. :)
Devolus

8

Ваша ошибка здесь:

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

Это не ошибка DNS, вместо этого ваша система пытается подключиться к хостам IPv6 и не работает. Предположительно, потому что у вас нет доступа к IPv6 на вашем хосте. Фактический поиск IPv6-адреса успешен. (Зеркало / архив ubuntu доступно как для IPv6, так и для IPv4. Вам просто не повезло, чтобы запустить IPv6, потому что ваша система считает, что он должен работать.)

Вы должны либо исправить это, установив miredo , либо повторить попытку, пока не попадете в зеркало IPv4.

Опять же, здесь важно понять, что DNS не виноват, как вы можете видеть по собственным тестам ping.


1
Спасибо за быстрый ответ и разъяснение, что это на самом деле не проблема DNS, я ценю это. Я установил Miredo - нет идти. Также стоит отметить, что когда я запускаю apt-get update -o Acquire :: ForceIPv4 = true, обновление apt-get по-прежнему не удается, я обновил исходное сообщение с этим ответом. Я пытался отключить UFW, думая, что это возможно, и до сих пор не повезло.
Томас В.

Странно - вы можете видеть, что у вас есть подключение IPv4, потому что ваш пинг успешен. Но вы не можете подключиться к зеркалу, несмотря на то, что у вас есть какие-то странные проблемы с маршрутизацией / сетью (я думаю, именно поэтому вы публикуете здесь!)

8

Официальный документ Docker предоставляет инструменты для настройки DNS-сервера для использования Docker

  1. Откройте /etc/default/dockerфайл для редактирования:

    sudo nano /etc/default/docker
    
  2. Добавьте настройку для Docker:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. Заменить 8.8.8.8на локальный DNS-сервер, такой как 192.168.1.1. Вы также можете указать несколько DNS-серверов. Разделил их пробелами, например:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    Предупреждение. Если вы делаете это на ноутбуке, подключенном к различным сетям, обязательно выберите общедоступный DNS-сервер.

    PS: nm-toolможет использоваться для проверки локального хоста DNS-сервера

  4. Сохраните и закройте файл.

  5. Перезапустите демон Docker.

    sudo service docker restart
    

Обратите внимание, что это старый файл конфигурации для Docker Upstart и SysVinit. Текущий способ для systemd (начиная с Ubuntu 16.04) - использовать /etc/docker/daemon.jsonнастройки демона docker, такие как dns.
Висбуки

0

Для других читателей, которые приходят сюда при использовании boot2docker, вот как я это исправил. На самом деле, ответ выше указал мне правильное направление.

По сути, по какой-то причине контейнеры внутри boot2docker не могут разрешить имена хостов.

Поэтому я просто перезапустил boot2docker и запустил контейнеры. Теперь имена хостов могут снова разрешиться правильно.

Я предполагаю, что проблема заключалась в запуске boot2docker во время подключения к сети на хосте, что привело к загрузке boot2docker и переходу в нерабочее состояние.


0

У меня была такая же проблема на Windows. Эта команда заставила меня работать:docker-machine restart


0

Перезапустите демон Docker в Debian9

service docker restart

и соединения и сети работает нормально


-1

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

Проблема была в перемещении / var / lib / docker. По космическим причинам он был смонтирован через NFS. Добавление локальной файловой системы и перемещение файлов туда решает проблему.


Если вы считаете, что на вопрос можно ответить ответом на аналогичный вопрос, отметьте его как дубликат этого вопроса. Если вы не можете этого сделать, вы должны оставить комментарий, а не делать отдельный ответ.
Дженни Ди говорит восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.