Немає підключення до Інтернету всередині контейнерів Docker


24

Я не можу виконати жодної команди, яка вимагає підключення до Інтернету всередині будь-якого контейнера Docker.

Працює:

docker run ubuntu /bin/echo 'Hello world'

Не працює:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

Аналогічно з pipі ping.

Я перебуваю на Ubuntu 16.04 і не використовую брандмауер або корпоративний проксі-сервер і намагався перезапустити Docker.

Оновлено:

Оновлення в інтерактивному режимі не вдається таким же чином.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update успішно працює на хості, тобто на моєму комп'ютері поза докер.

Оновлена версія Докера 1.12.1, збірка 23cf638


Чи можете ви відімкнути домен від хоста? Чи можете ви працювати apt-get updateв інтерактивному режимі з докером?
adampski

на виході показано помилку: Тимчасове усунення помилки 'archive.ubuntu.com' ... спробуйте .. ping www.google.com .. подивіться, чи отримаєте ви таку ж відповідь .. тоді спробуйте ... ping 8.8.8.8 .. Якщо IP працює, а ім'я хоста не працює, то ваш DNS порушений (докладніше /etc/resolv.conf, щоб побачити, який DNS-сервер використовується)
TG2

@adampski, я оновив запитання на основі ваших пропозицій.
Сашко Лихченко

@ TG2, я оновив питання на основі ваших пропозицій.
Сашко Лихченко

Яку версію докерного двигуна ви працюєте?
adampski

Відповіді:


14

Як запропонував скрип у випуску GitHub №866 для Docker :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Це змусить докер відтворити міст і знову встановити всі правила мережі"


1
Я спробував це, і це вбиває мережу на всьому моєму комп’ютері.
петерсон

Це корисно і вирішило проблему для мене. Дякую.
Рао

10
-dПрапор не виходить.
Luís de Sousa

2
Привіт @ LuísdeSousa Прикро, що ви проголосували за це, але врахуйте можливість того, що, можливо, деякі нові комутатори будуть видалені або змінені в нових версіях. Тим більше, що це було більше року тому.
adampski

3
замість того, щоб лише скопіювати / пропустити команду, ви могли пояснити, що це означає :)
Аделін

12

У StackOverflow є аналогічна проблема, коли інше рішення вирішує цю проблему з Docker 17.09 на Ubuntu 16.04:

Перевірте вміст resolv.conf:

$ cat /etc/resolv.conf

Якщо вона включає в себе такий рядок, nameserver 127.0.1.1це означає, що контейнери отримують невірні сервери імен. Щоб виправити це, відредагуйте NetworkManager.confфайл:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

І прокоментуйте рядок із dns=dnsmasq; файл повинен виглядати так:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Нарешті, перезапустіть мережевий менеджер:

$ sudo systemctl restart network-manager

Перевірте контейнер ще раз:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

Моя установка відповідала опису, і вищевказаний підхід вирішив проблему для мене.
krcools

оновлена ​​відповідь для Ubuntu 18.04: superuser.com/a/1335054
wisbucky

7

Перше, що потрібно перевірити, це запустити cat /etc/resolv.confв контейнер докера . Якщо у нього недійсний DNS-сервер, наприклад nameserver 127.0.x.x, контейнер не зможе вирішити доменні імена в ip-адреси, тому ping google.comне вдасться.

Друге, що потрібно перевірити, працює cat /etc/resolv.confна хост-машині . Docker в основному копіює хост /etc/resolv.confу контейнер щоразу, коли контейнер запускається. Так що, якщо хост /etc/resolv.confпомиляється, то так буде і з контейнером докера.

Якщо ви виявили, що хост /etc/resolv.confнеправий, то у вас є два варіанти:

  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"]
    }
    
  • Перезапустіть демон демона, щоб ці зміни вступили в силу:
    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 за замовчуванням використовує 8.8.8.8 сервер DNS Google, який може зламатися для людей, що знаходяться за брандмауером.

  • /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хост для докера для копіювання в контейнери.

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