Обновление докеры apt-get
Может кто-нибудь помочь мне получить apt-get работать в моем контейнере докера? Всякий раз, когда я пытаюсь запустить любую команду apt-get в контейнере докера, команда не работает. Я запускаю Docker версии 1.1.1, строю bd609d2 на ubuntu 12.04.
Когда я делаю
$ sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update
Я получаю ошибки, говоря
Не удалось решить 'archive.ubuntu.com'
Я попытался раскомментировать строку ниже в /etc/default/docker
DOCKER_OPTS = "- dns 8.8.8.8 --dns 8.8.4.4"
но я все еще не могу выполнить ping google.com
ping: неизвестный хост
Я подтвердил, что контейнер использует серверы DNS 8.8.8.8 и 8.8.4.4
root @0baa87fc6322:/# cat/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
и я могу выполнить ping на обоих серверах, поэтому я уверен, что брандмауэр не просто отбрасывает мои пакеты.
Любая помощь с этим будет оценена!
Спасибо!
Ответы
Ответ 1
Спасибо за вашу помощь! Я узнал, что это была проблема DNS и что это из-за брандмауэра. После поиска еще несколько я нашел этот вопрос, который мне не удалось найти при поиске "docker apt-get fail"
Docker - Сбой сетевых вызовов при построении образа в корпоративной сети
Его проблема была похожа на мою, и решение помогло мне заставить ее работать.
Я скопировал его решение для тех, кто находит этот вопрос в будущем.
Эти серверы Google не были доступны из-за нашего брандмауэра, поэтому мы не смогли разрешить какие-либо URL-адреса.
Исправление заключается в том, чтобы сообщить Docker, какие DNS-серверы использовать. Это зависит от того, как вы установили Docker: Пакет Ubuntu
Если у вас установлен пакет Ubuntu, отредактируйте файл /etc/default/docker и добавьте следующую строку:
DOCKER_OPTS = "- dns <your_dns_server_1 > -dns <your_dns_server_2 > "
Вы можете добавить столько DNS-серверов, сколько захотите. После того как вы отредактировали этот файл, вам нужно перезапустить службу Docker:
перезагрузка службы sudo docker
Бинарные
Если вы установили Docker через метод двоичных файлов (т.е. нет пакета), то вы установите DNS-серверы при запуске демона Docker:
sudo docker -d -D -dns -dns &
Ответ 2
Если вы видите ошибку типа Could not resolve ...
, скорее всего, это конфигурация 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 варианта:
Жесткий код DNS-сервера в daemon.json. Это легко, но не идеально, если вы ожидаете изменения DNS-сервера.
Починить хозяев /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
B. Ubuntu 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
на хосте для докера, чтобы скопировать в контейнеры.
Ответ 3
Сначала проверьте, есть ли у вас соединение, пинг непосредственно на ip 91.189.92.201
, на который archive.ubuntu.com
указано:
ping 91.189.92.201
Если вы все еще не можете связаться с хостом, это не проблема DNS.
Также, если у вас есть подключение к Интернету, вы можете сделать взлом. Просто поместите строку в файл /etc/hosts
и устраните проблему:
91.189.92.201 archive.ubuntu.com
Ответ 4
Я столкнулся с проблемой в двух разных случаях, и разрешение было другим...
Первый с Win7 + virtualbox (Xubuntu 16.04)
Этот комментарий выполнил эту работу: fooobar.com/questions/311308/...
Я изменяю файл /etc/default/docker:
DOCKER-OPTS = "- ip-masq = true --dns my_ip_dns_win --dns 8.8.8.8 --dns 8.8.4.4" И запустите перезагрузка sudo docker
Второй на Xubuntu OS (ubuntu 16.04)
Прецедентного разрешения было недостаточно.
Этот комментарий выполнил эту работу: https://github.com/docker/docker/issues/1809
Мне пришлось прокомментировать одну строку в файле /etc/NetworkManager/NetworkManager.conf:
= Dnsmasq DNS
Затем запустите
sudo restart network-manager
Ответ 5
Я использую версию Mint и после установки Docker и пытаюсь создать образ Ubuntu, чтобы команда apt-get update не распознавала, чтобы устранить проблему, я сделал шаг вниз
docker run -it -p 8080:80 ubuntu /bin/bash
echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts
cat /etc/hosts
apt-get update
Ответ 6
Я столкнулся с той же проблемой с docker-compose
. Я решаю это, добавив запись ENV http_proxy 'proxy.com'
в Dockerfile.