Сбой сетевых вызовов во время сборки образа в корпоративной сети
У меня проблема с созданием образов 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?
Ответы
Ответ 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)