Сборка Docker «Не удалось разрешить 'archive.ubuntu.com'» apt-get не может ничего установить

101

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

Как только файл Docker включал любую строку, предназначенную для установки программного обеспечения, он завершался ошибкой с сообщением о том, что пакет не найден.

RUN apt-get -y install supervisor nodejs npm

Обычное сообщение, которое появлялось в журналах, было

Could not resolve 'archive.ubuntu.com'

Есть идеи, почему никакое программное обеспечение не устанавливается?

Мэтт Кэрриер
источник
это произойдет, когда машина будет отключена от сети ... Я видел, что это происходит на ноутбуке с Linux с новой установкой докера, если я только выдаю newgrp dockerвместо полного выхода из системы, а затем авторизуюсь после того, как предоставил себе sudo usermod -aG docker myuserid... это крайний случай для конечно, однако это действительно происходит
Скотт Стенсленд

Ответы:

250

Раскомментировав DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"в /etc/default/dockerкачестве Matt Carrier предложил ничего НЕ работать для меня. Не помещал в этот файл и DNS-серверы моей корпорации. Но есть другой способ (читайте дальше).

Во-первых, давайте проверим проблему:

$ docker run --rm busybox nslookup google.com   # takes a long time
nslookup: can't resolve 'google.com'   # <--- appears after a long time
Server:    8.8.8.8
Address 1: 8.8.8.8

Если кажется, что команда зависает, но в конечном итоге выдает ошибку «не удается разрешить 'google.com'», значит, у вас та же проблема, что и у меня.

Команда nslookupзапрашивает DNS-сервер 8.8.8.8, чтобы преобразовать текстовый адрес google.com в IP-адрес. Как ни странно, 8.8.8.8 - это общедоступный DNS-сервер Google . В случае nslookupсбоя общедоступные DNS-серверы, такие как 8.8.8.8, могут быть заблокированы вашей компанией (что, как я полагаю, из соображений безопасности).

Можно подумать , что добавление DNS - серверов вашей компании , чтобы DOCKER_OPTSв системе /etc/default/dockerдолжно сделать трюк, но по какой - то причине, это не работа для меня. Ниже я описываю, что у меня работало.

РЕШЕНИЕ :

На хосте (я использую Ubuntu 16.04) узнайте адреса первичного и вторичного DNS-серверов:

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

Используя эти адреса, создайте файл /etc/docker/daemon.json:

$ sudo su root
# cd /etc/docker
# touch daemon.json

Поместите это в /etc/docker/daemon.json:

{                                                                          
    "dns": ["10.0.0.2", "10.0.0.3"]                                                                           
}     

Выход из корня:

# exit

Теперь перезапустите докер:

$ sudo service docker restart

ВЕРИФИКАЦИЯ :

Теперь убедитесь, что добавление /etc/docker/daemon.jsonфайла позволяет преобразовать google.com в IP-адрес:

$ docker run --rm busybox nslookup google.com
Server:    10.0.0.2
Address 1: 10.0.0.2
Name:      google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net

ЛИТЕРАТУРА :

Я основал свое решение на статье Робина Уинслоу, который заслуживает всей признательности за это решение. Спасибо, Робин!

"Исправить конфигурацию DNS сети Docker." Робин Уинслоу. Проверено 9 ноября 2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Мэтью Краус
источник
3
Я получил ошибку, что сервис не может быть запущен после изменений. Это произошло потому, что я изменил DOCKER_OPTS в / etc / default / docker и /etc/init.d/docker. Отмена изменений разрешила проблему запуска службы
докеров
7
Это сработало для меня (в сети компании), в то время как принятое решение - нет.
Дэвид Эббо
1
Это сработало и для меня, в то время как принятое решение - нет. Я использовал nslookup, чтобы получить IP-адрес своего DNS-сервера, но не nmcli.
Necro
2
daemon.json у меня тоже работает! И вы можете проверить, заблокировала ли ваша компания 8.8.8.8 с помощью этой команды. nslookup google.com 8.8.8.8В моем случае это так, я получил эту ошибкуconnection timed out; no servers could be reached
ROTOGG
3
Я думаю, что причина /etc/default/dockerне сработала для некоторых людей (цитируя комментарий из файла)# THIS FILE DOES NOT APPLY TO SYSTEMD
Якуб Боченски
88

После долгой головной боли я нашел ответ. Could not resolve 'archive.ubuntu.com'можно исправить, внеся следующие изменения:

  1. Раскомментируйте следующую строку в /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Перезапустите службу Docker sudo service docker restart

  3. Удалите все изображения, в которых кэшированы недопустимые настройки DNS.

  4. Постройте снова, и проблема должна быть решена.

Кредит принадлежит Эндрю С.Б.

Мэтт Кэрриер
источник
7
вы также можете добавить --no-cache = true, если вы не хотите делать # 3 выше
jschorr
8
У меня это не работает, и я понятия не имею, почему. Я боролся с этим то и дело в течение нескольких недель.
Кори Огберн
2
Я работаю на linux mint, поэтому boot2docker отсутствует. / etc / default / docker создан и имеет флаг DOCKER_OPTS выше. Я перезапустил службу, очистил все изображения и контейнеры, но все равно ничего.
Кори Огберн
2
@CoreyOgburn Я бы также попробовал --no-cache = true, как упоминалось выше jschorr. Пример:docker build --no-cache=true ...
Мэтт Кэрриер,
6
Я сбежал, docker build --no-cache=true -t docker-whale .но, похоже, ничего другого не произошло.
Кори Огберн
47

Я сталкиваюсь с той же проблемой, но мне не помогает раскомментирование записей / etc / default / docker dns и редактирование /etc/resolv.conf в контейнере сборки или /etc/docker/daemon.json .

Но после того, как я построил с опцией --network = host, разрешение снова было в порядке.

docker build --network=host -t my-own-ubuntu-like-image .

Может быть, это снова кому-то поможет.

Джеральд Хансен
источник
Я долгое время получал другую ошибку: «Не удалось подключиться к archive.ubuntu.com:80 (xxxx). - connect (111: Подключение отклонено)» и обнаружил, что использование --network = host теперь исправлено моя проблема
Эрик Арсено
После множества попыток устранения неполадок это единственное, что у меня сработало.
math0ne
15

Я считаю, что ответ Мэтта Кэрриера - правильное решение этой проблемы. Тем не менее, после его реализации, я по- прежнему наблюдается такое же поведение: could not resolve 'archive.ubuntu.com'.

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

Как я отсортировал:

  1. Поскольку я работал с документацией Docker, на моем компьютере уже был установлен образец образа. Мне удалось запустить новый контейнер для запуска этого образа и создать новый сеанс bash в этом контейнере:docker run -it docker/whalesay bash
  2. Есть ли у контейнера подключение к Интернету ?: ping 172.217.4.238(google.com)
  3. Может ли контейнер разрешать имена хостов? ping google.com

В моем случае первый pingрезультат дал ответы, второй - нет.

Как я исправил:

Как только я обнаружил, что DNS не работает внутри контейнера, я подтвердил, что могу воспроизвести такое же поведение на хосте. nslookup google.comрешается просто отлично на хосте. Но, nslookup google.com 8.8.8.8или nsloookup google.com 8.8.4.4истекло время.

Затем я нашел серверы имен, которые использовал мой хост nm-tool(в Ubuntu 14.04). В духе быстрой обратной связи, я завела пример изображения снова, и добавила IP - адрес сервера имен в файл resolv.conf контейнера: sudo vi /etc/resolv.conf. После сохранения я снова попытался проверить связь ( ping google.com), и на этот раз это сработало!

Обратите внимание, что изменения, внесенные в файл resolv.conf контейнера, не являются постоянными и будут потеряны при перезапуске контейнера. В моем случае более подходящим решением было добавить IP-адрес моего сетевого сервера имен в /etc/default/dockerфайл хоста .

TMcManemy
источник
2
Конкретные команды для получения адресов серверов имен: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) и nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Предоставлено: Марти Фрид .
r0estir0bbe
Это более обширный ответ. У меня всегда возникают проблемы при переключении на офисную сеть или при изменении сети. Добавление DNS-сервера вашей компании устраняет проблему поиска.
gvd
1
Очень поучительно! Редко можно найти ответы, которые показывают, как проверить проблему, а затем предоставить исправление (и убедиться, что исправление работает). Отличное устранение неполадок!
Мэтью Краус
Эй, ты можешь мне помочь? У меня такая же проблема, но мой хост - это машина с Windows, на которой я пытаюсь запустить свой контейнер докеров и пытаюсь настроить там образ Ubuntu. Когда вы здесь говорите о сервере имен, означает ли это адрес DNS-сервера моей машины с Windows? И в этом тоже будет оно первичным или вторичным?
CodeHunter
Это точная проблема, с которой я столкнулся, когда моя организация заблокировала общедоступный DNS и установка DNS организации в / etc / default / docker в разделе DOCKER_OPTS сработала, и проблема была решена.
Приветствую
7

После добавления локального IP-адреса DNS в файл докеров по умолчанию он начал работать для меня ... пожалуйста, найдите следующие шаги ...

$ nm-tool # (will give you the dns IP)

DNS: 172.168.7.2

$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"

$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)

$ docker rmi $(docker images -q) # (remove all the images)

$ service docker restart #(restart the docker to pick up dns setting)

Теперь идите и создайте докер ... :)

Пракаш Н.Д.
источник
7

Для всех, у кого также есть эта проблема, я решил свою проблему, отредактировав /etc/default/docker файл, как это было предложено другими ответами и вопросами. Однако я понятия не имел, какой IP использовать в качестве DNS.

Только через некоторое время я понял, что мне нужно запустить ifconfig dockerна хосте, чтобы показать IP для сетевого интерфейса докера.

docker0   Link encap:Ethernet  Endereço de HW 02:42:69:ba:b4:07  
          inet end.: 172.17.0.1  Bcast:0.0.0.0  Masc:255.255.0.0
          endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Métrica:1
          pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:0 
          RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)

Так было 172.17.0.1в моем случае. Надеюсь, это поможет всем, у кого также есть эта проблема.

Vini.g.fer
источник
7
Было бы полезно, если бы вы указали способ редактирования файла докера
Physincubus
1
На Ubuntu 18.04:ifconfig docker0
Автоморфный
6

Я нашел этот ответ после некоторого поиска в Google. Я использую Windows, поэтому некоторые из приведенных выше ответов не применимы к моей файловой системе.

В основном запускают:

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Который просто перезаписывает существующий сервер имен, используемый, как 8.8.8.8мне кажется. У меня это сработало!

Судя по некоторым комментариям, возможно, вам понадобится root. Для этого нужно выпустить sudo -i.

Engineero
источник
У меня это не сработало в Windows 10, потому sshчто не существует?
Seanny123
@ Seanny123 уже давно я ничего не делал с этим, но я тоже был на Windows 10. Возможно, в то время я использовал старую Docker Toolbox ? В противном случае вам может потребоваться включить клиент Windows SSH . Я бы наверное начал с этого.
Engineero
1
это сработало для меня после того, как я стал root, для этого проблема, как sudo -iтолько вы
войдете
5

Я просто хотел добавить поздний ответ для всех, кто сталкивается с этой проблемой в поисковых системах.

НЕ делайте этого: раньше у меня была опция в / etc / default / docker для установки iptables=false. Это произошло потому, что ufw не работал (все было открыто, хотя было разрешено только 3 порта), поэтому я слепо последовал ответу на этот вопрос: Несложный брандмауэр (UFW) ничего не блокирует при использовании Docker. и это, которое было связано в Комментарии

Я очень плохо разбираюсь в правилах / нат / маршрутизации iptables в целом, поэтому я мог сделать что-то иррациональное.

Оказывается, я, вероятно, неправильно его сконфигурировал и убил разрешение DNS внутри своих контейнеров. Когда я запустил интерактивный контейнерный терминал:docker run -i -t ubuntu:14.04 /bin/bash

У меня были такие результаты:

root@6b0d832700db:/# ping google.com
ping: unknown host google.com

root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4

root@6b0d832700db:/# 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=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms

Восстановление всей моей конфигурации ufw (до rules), отключение ufw и удаление iptables = false из / etc / default / docker восстановили функциональность разрешения DNS контейнеров.

Теперь я с нетерпением жду возможности повторно включить функциональность ufw, следуя этим инструкциям .

Сено
источник
3

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

Шаги:

  1. Как уже упоминалось, добавьте DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"в /etc/default/docker.
  2. Вручную очистите содержимое таблицы PREROUTING с помощью файла iptables -t nat -F POSTROUTING. После запуска перезапустите докер, и он инициализирует таблицу nat с новым диапазоном IP-адресов.
JQian
источник
3

Такая же проблема для меня (на Ubuntu Xenial).

  • docker run --dns ... для контейнеров работал.
  • Обновление параметров демона докеров для docker build(docker-compose и т. Д.) Не сработало.

После анализа журналов docker ( journalctl -u docker.service), если обнаружено какое-то предупреждение о применении плохого resolvconf.

После этого я обнаружил, что наши корпоративные серверы имен были добавлены к сетевым интерфейсам, но не в resolvconf.

Применил это решение. Как настроить статический DNS в интерфейсах? (askubuntu) , т.е. добавление серверов имен в/etc/resolvconf/resolv.conf.d/tail

После обновления resolvconf (или перезагрузки).

bash docker run --rm busybox nslookup google.com

сработало мгновенно.

Все мои сборки docker-compose сейчас работают.

Mkoertgen
источник
2

Сегодня у меня такая же проблема, я просто добавил строку ниже в / etc / default / docker

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

а затем я перезапустил свой ноутбук.

В моем случае перезапуска демона докеров мне недостаточно, мне нужно перезагрузить ноутбук, чтобы он заработал.

Юсуф Ибрагим
источник
2

Прежде чем тратить слишком много времени на другие решения, просто перезапустите Docker и попробуйте еще раз.

Решил проблему для меня, используя Docker Desktop для Windows в Windows 10.

CGFoX
источник
В моем случае перезапуск с правами администратора решил проблему.
вена
2

Я тоже некоторое время боролся с этим сейчас, но вот что решило это для меня Ubuntu 16.04 x64. Надеюсь, это тоже сэкономит чье-то время.

  1. В /etc/NetworkManager/NetworkManager.conf: закомментировать #dns=dnsmasq

  2. Создать (или изменить) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Перезагрузите докер: sudo service docker restart
Palamunder
источник
Кажется, то же решение, что и stackoverflow.com/a/40516974/2308683
OneCricketeer
Вообще-то нет. Исправление в NetworkManager.conf имело значение в моем случае.
palamunder
Я очень сомневаюсь, что отключение dnsmasq для всей системы - лучшее решение специально для Docker
OneCricketeer
Я делюсь тем, что у меня сработало после двух дней борьбы с этой проблемой.
palamunder
0

В моей системе ( macOS High Sierra 10.13.6с Docker 2.1.0.1) это произошло из-за корпоративного прокси.

Я решил это в два этапа:

  1. Настройте параметры прокси вручную в Preferences>Proxies
  2. Добавьте те же настройки в свой config.json внутри, ~/.docker/config.jsonнапример:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
Густавз
источник