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

Сбой сетевых вызовов во время сборки образа в корпоративной сети

У меня проблема с созданием образов Docker в моей корпоративной сети. Я только начинаю работать с Docker, поэтому у меня есть следующий Dockerfile для приложения типа hello-world:

# DOCKER-VERSION 0.3.4
FROM    centos:6.4
# Enable EPEL for Node.js
RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN     yum install -y npm
# Bundle app source
ADD . /src
# Install app dependencies
RUN cd /src; npm install
EXPOSE  8080
CMD ["node", "/src/index.js"]

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

Тем не менее, когда я нахожусь в моей корпоративной сети на работе, эта же сборка Docker завершается неудачно при попытке снять RPM с сайта download.fedoraproject.org с таким сообщением об ошибке:

Step 2: RUNrpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Running in e0c26afe9ed5 curl: (5) Couldn't resolve proxy 'some.proxy.address' error: skipping http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - transfer failed

В моей корпоративной сети я могу получить доступ к этому URL с моего ноутбука. Но как только Докер пытается построить контейнер, он вдруг не может его решить. Это поведение одинаково для различных внешних ресурсов (apt-get и т.д.): Все они могут прекрасно работать на моем ноутбуке в корпоративной сети, но Docker не может их разрешить.

У меня нет сетевых ноу-хау, чтобы понять, что здесь происходит. Кто-нибудь знает, почему это странное поведение будет происходить при сборке контейнеров Docker?

4b9b3361

Ответ 1

Мне удалось выяснить эту проблему. В Ubuntu Docker устанавливает DNS-серверы для контейнера на серверы Google по адресу 8.8.8.x. Насколько я понимаю, это обходной путь Ubuntu из-за того, что Ubuntu устанавливает /etc/resolv.conf как 127.0.0.1.

Эти серверы 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 service docker restart

Бинарные

Если вы установили Docker через метод двоичных файлов (т.е. нет пакета), то вы установите DNS-серверы при запуске демона Docker:

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &

Ответ 2

Советую изменить настройки DNS демона Docker. Вы можете установить параметры по умолчанию для демона докеров, создав файл конфигурации демона в /etc/docker/daemon.json. Установите DNS-сервер в соответствии с вашим хост-компьютером, например. мой DNS-сервер - 10.0.0.2:

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

Затем вам нужно просто перезапустить службу докеров:

sudo service docker restart

Пошаговое объяснение доступно здесь Настройка конфигурации DNS Docker network

Ответ 3

Следующие шаги работают для меня (для команды запуска docker и команды запуска docker). Моя версия Linux - Ubuntu 14.04.

  • Идентифицируйте DNS, используя следующую команду.
    nm-tool | grep DNS

Этот результат DNS: 192.168.1.1 в моем случае

  • Создайте запись в файле /etc/default/docker.io. Моя текущая запись выглядит следующим образом:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
  • Перезапустить службу докеров
 sudo service docker.io restart 

Ответ 4

Для любого дистрибутива Linux, работающего с SystemD (Ubuntu 16, RHEL 7...), путь будет отображаться с помощью следующей команды:

$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2016-06-29 08:10:33 PDT; 2min 34s ago
     Docs: https://docs.docker.com
 Main PID: 1169 (dockerd)
    Tasks: 19
   Memory: 85.0M
      CPU: 1.779s
   CGroup: /system.slice/docker.service
           ├─1169 /usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
           └─1232 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --met

Путь будет /lib/systemd/system/docker.service. Добавьте значения DOCKER_OPTS, которые могут иметь любой из --dns, в строке, где запускается демон.

cat /lib/systemd/system/docker.service | grep dns 
ExecStart=/usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4  -H fd://

Ответ 5

Докер (по крайней мере> = 1.13, возможно, ранее) на Mac и Windows позволяет вам настроить DNS в "Предпочтениях" → "Демон" → "Дополнительно":

Следующая конфигурация устанавливает два корпоративных DNS-сервера (используйте здесь свои собственные значения) с резервным откликом на общедоступные DNS-серверы Google.

Docker Daemon Adv Config

Ответ 6

Укажите свой DNS для демона Docker.

Прежде всего, получите свой DNS-адрес

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

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

$ docker run --dns 10.0.0.2 <image_name> <command_name>

Если это решит проблему, вы можете применить это исправление для всех демонов докера следующим образом

Отредактируйте или создайте файл /etc/docker/daemon.json

Добавьте следующую строку в этот файл

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

Перезапустите докер

$ sudo service docker restart

Очень хорошее руководство для ВСЕХ этого процесса можно найти здесь.

https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Ответ 7

Решение без перезапуска службы Docker

Можно изменить настройки DNS для одного образа Docker, не затрагивая другие вызовы docker build (и не перезапуская службу Docker), переопределив resolv.conf во время сборки:

FROM ubuntu:18.04

RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update

Замените IP 123.123.123.123 на тот, который используется в вашей корпоративной сети (используйте nmcli dev show | grep 'IP4.DNS', чтобы получить текущий используемый DNS-сервер).

МИНУСЫ:

  • Это не влияет ни на какую другую строку из Dockerfile. Следовательно, вы должны префикс каждой строки с исправлением, если это зависит от разрешения DNS

Ответ 8

На моем компьютере с Ubuntu 16.04 иногда DNS Google не работают для создания образов Docker.

cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }

Я должен вручную найти DNS моих поставщиков услуг, используя следующую команду

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

и добавьте его в мой daemon.json, как показано ниже

cat /etc/docker/daemon.json 

{"dns": ["125.22.47.102","8.8.8.8"] }

 restart docker

sudo service docker restart

(PS nm-tool устарел в Ubuntu 15.04)