Я не могу выполнить команду, требующую подключения к Интернету, внутри любого контейнера Docker.
Работает:
docker run ubuntu /bin/echo 'Hello world'
Не работает:
docker run ubuntu apt-get update
Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease Temporary failure resolving 'archive.ubuntu.com'
Похоже с pip
и ping
.
Я нахожусь на Ubuntu 16.04 и не использую брандмауэр или корпоративный прокси-сервер и попытался перезапустить Docker.
UPD:
Обновление в интерактивном режиме не выполняется аналогичным образом.
docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly
sudo apt-get update
работает успешно на хосте, т.е. на моем компьютере вне докера.
Upd Docker версия 1.12.1, сборка 23cf638
networking
ubuntu
docker
Сашка Лыхенко
источник
источник
apt-get update
в док-режиме в интерактивном режиме?Ответы:
В соответствии с предложением Creack по проблеме GitHub № 866 для Docker :
«Это заставит докер воссоздать мост и переустановить все сетевые правила»
источник
-d
Флаг не выходит.Существует аналогичная проблема в StackOverflow, где другое решение решает эту проблему с Docker 17.09 в Ubuntu 16.04:
Проверьте содержание
resolv.conf
:Если он содержит такую строку,
nameserver 127.0.1.1
значит, контейнеры получают неправильный сервер имен. Чтобы исправить это, отредактируйтеNetworkManager.conf
файл:И закомментируйте строку с
dns=dnsmasq
; файл должен выглядеть так:Наконец, перезапустите сетевой менеджер:
Проверьте снова контейнер:
источник
Первое, что нужно проверить, - запустить
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 варианта:Жесткий код DNS-сервера в daemon.json. Это легко, но не идеально, если вы ожидаете изменения DNS-сервера.
Починить хозяев
/etc/resolv.conf
. Это немного сложнее, но генерируется динамически, и вы не программируете DNS-сервер.1. Жесткий код DNS-сервера в Docker Daemon.json
редактировать
/etc/docker/daemon.json
Перезапустите демон 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
на хосте докер для копирования в контейнеры.источник