Подтвердить что ты не робот

Обновление докеры 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 на обоих серверах, поэтому я уверен, что брандмауэр не просто отбрасывает мои пакеты.

Любая помощь с этим будет оценена!

Спасибо!

4b9b3361

Ответ 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 варианта:

  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

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

Error with docker-compose Я столкнулся с той же проблемой с docker-compose. Я решаю это, добавив запись ENV http_proxy 'proxy.com' в Dockerfile.