Мережеві дзвінки не вдаються під час створення іміджу в корпоративній мережі


81

У мене виникають проблеми зі створенням зображень Docker у моїй корпоративній мережі. Я тільки починаю роботу з Docker, тому у мене є такий файл Docker для програми типу 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"]

Це чудово працює, коли я будую його на своєму ноутбуці вдома, у власній бездротовій мережі. Він знімає необхідні залежності та правильно створює зображення.

Однак, коли я працюю в своїй корпоративній мережі, ця сама докерна збійка не вдається при спробі зняти RPM із download.fedoraproject.org із таким повідомленням про помилку:

Крок 2: RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Запуск у e0c26afe9ed5 curl: (5) Couldn ' t вирішити помилку проксі "some.proxy.address": пропуск http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - передача не вдалася

У своїй корпоративній мережі я маю чудовий доступ до цієї URL-адреси зі свого ноутбука. Але коли Docker намагається побудувати контейнер, раптом це не може вирішити взагалі. Ця поведінка однакова для різних зовнішніх ресурсів (apt-get тощо): усі вони можуть добре вирішити проблеми на моєму ноутбуці в корпоративній мережі, але Docker не може їх вирішити.

У мене немає мережевого ноу-хау, щоб зрозуміти, що тут відбувається. Хтось знає, чому ця дивна поведінка могла відбуватися при складанні контейнерів Docker?


погляньте на stackoverflow.com/questions/19210563/… це може також вирішити вашу проблему
Thomasleveil

та сама проблема виникла у мене. Я забув бігти apt-get update.
matthiasbe

Це можуть бути симптоми "Docker не отримує інформацію про DNS з Cisco AnyConnect" forums.docker.com/t/…
Джейсон,

Відповіді:


93

Я зміг з’ясувати проблему. На 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> &

4
а як щодо використання команди 'docker build' з Dockfiles ... це не схоже на те, що це працює в таких обставинах: docker --dns = 209.18.47.61 build. 2> & 1 | tee ./output.txt
Квазавр

2
так, це повинно працювати з побудовою docker. docker build не має прапорця --dns у самій команді, але якщо ви встановите його на демон таким чином, він застосовуватиметься при використанні
docker

Дякуємо за це рішення. З моєї сторони проблема полягала в тому, що докеру, очевидно, потрібен IPv4, щоб бути доступним і увімкненим. WTF? Дізнайтеся: IPv4 мертвий. Програмне забезпечення, яке є лише IPv4, серйозно порушено.
Тіно

1
Я вже зробив цей крок і знову почав отримувати помилки. Перезапуск служби виправив це знову.
Ендрю Гроте,

У мене проблема з docker 1.7, хоча я намагався запустити його або з --dnsопцією, або ввівши конфігурацію/etc/default/docker
Patryk

65

Я раджу змінити налаштування DNS демона Docker. Ви можете встановити параметри за замовчуванням для демона 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 мережі


20

Наступні кроки працюють для мене (як для збірки докера, так і для команди запуску докера). Моя версія Linux - Ubuntu 14.04.

  • Визначте DNS, використовуючи наступну команду.
    нм-інструмент | 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 перезапустити 

2
Еквівалентом CentOS є /etc/sysconfig/dockerфайл, до якого я зміг додати DOCKER_OPTS="--dns 8.8.8.8"рядок і вирішити свою проблему.
MarkHu

/etc/sysconfig/dockerФайл має і OpenSuSE .
Девід Лакатос

11

Для будь-якого дистрибутива 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://

1
Дякую! Після редагування docker.serviceмені довелося зупинити службу sudo service docker stopsystemctl daemon-reloadsudo service docker start
докера,

1
Вам краще додати одиничний файл у /etc/systemd/system/docker.service.dзмінену конфігурацію (яка systemd корисно об’єднує / замінює конфігурацію системи), а не змінювати версію системи. Останні будуть втрачені при модернізації.
Раман,

6

Docker (принаймні> = 1,13, можливо раніше) на Mac і Windows дозволяє налаштувати DNS у меню Налаштування -> Демон -> Додатково:

Наступна конфігурація встановлює два корпоративні DNS-сервери (використовуйте тут свої власні значення) із резервними копіями для загальнодоступних DNS-серверів Google.

Docker Daemon Adv Config


5

Вкажіть свій 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/


Це відповідь лише на прикордонне посилання . Вам слід розширити свою відповідь, включивши сюди якомога більше інформації, і використовувати посилання лише для довідки.
До побачення StackExchange

якщо ви встановили оснащення daemon.jsonбуде о/var/snap/docker/<id>/config/daemon.json
sjt003

3

Рішення без перезапуску служби 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-сервера).

Недоліки:

  • Це не впливає на будь-який інший рядок із файлу Docker. Отже, вам слід додати до кожного рядка префікс виправлення, якщо це залежить від роздільної здатності DNS

1

На моїй машині 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-інструмент застарілий від Ubuntu 15.04)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.