Мой докер контейнер не имеет интернета


139

У меня было все в порядке, но теперь это прекратилось. Я пробовал следующие команды безрезультатно:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 - как на хосте, так и на контейнере

Все , что я получаю unknown host google.com. Докер версия 0.7.0

Любые идеи?

PS также ufwотключен


9
Ваш вопрос решил мою проблему: пришлось бежать sysctl -w net.ipv4.ip_forward=1(на Centos 6)
qwertzguy

Поскольку у вас может быть проблема с маршрутизацией
Docker

То же самое и здесь, после того, как я исправил /etc/resolv.conf на хост-компьютере, без которого он не работалsysctl -w net.ipv4.ip_forward=1
Reeebuuk

Также убедитесь, что у вас есть правильные значения для /etc/resolv.confна хост- машине
Hanxue

для меня после того, как sysctl -w net.ipv4.ip_forward=1мне пришлось бежать sudo service docker restart.
Асиф Али

Ответы:


101

Первое, что нужно проверить, - запустить 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

Б. Убунту 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на хосте докер для копирования в контейнеры.


1
Это решило проблему в Ubuntu 16.04 с Docker 17.09.
Луис де Соуза

2
Это решило мою проблему (так же, как OP, Ubuntu 14.04 / Docker 18.01.0-ce). Эта ссылка может быть полезной для проверки интернет-соединения без ping, если у вас нет команды ping на вашем образе докера. Если на вашем хосте нет systemctl(Ubuntu 14.04), попробуйте Как перезапустить сетевой сервис? и / или перезагрузите компьютер.
Бенджамин

Работал как шарм!
Homewrecker

1
Это работает на Ubuntu 18.04 (вариант B). Однако докер не передал теперь корректный /etc/resolv.confконтейнер в конструкцию, мне пришлось вручную скопировать файл в контейнер.
глау

1
На моей машине (RedHat 7.4) файл конфигурации хоста правильный, но файл контейнеров все еще указывает на 172.0.0.11. Так что же теперь делать?
Мартин Маевски,

90

Исправлено, следуя этому совету:

[...] вы можете попробовать сбросить все?

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

Это заставит докер воссоздать мост и переустановить все сетевые правила

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

Кажется, интерфейс как-то «завис».

Обновление для более новых версий докера:

Вышеприведенный ответ все еще может выполнить работу за вас, но прошло довольно много времени с тех пор, как этот ответ был опубликован, и докер теперь более отточен, поэтому убедитесь, что вы сначала попробовали это, прежде чем углубляться в iptablesи так далее.

sudo service docker restart или (если вы находитесь в дистрибутиве Linux, который не использует upstart) sudo systemctl restart docker


31
docker -dвыходит из строя. Там нет -dфлага.
Луис де Соуза

1
Для тех, кто все еще имеет проблему, есть открытая проблема на github Moby, которая была открыта больше года: github.com/moby/moby/issues/26567
Nepoxx

1
@Pawan:ip link del docker0
drewrockshard

1
или установите bridge-utils
cjdcordeiro

5
docker -dне существует в новых версиях. Вместо: service docker stopтогда dockerd, тогдаservice docker start
Telmo Marques

64

Предполагаемый способ перезапустить Docker - это не делать это вручную, а использовать команду serviceor init:

service docker restart

5
если вы находитесь в дистрибутиве Linux, который не использует upstart, то dodo systemctl restart docker работал на меня
Джеффри

перезагрузка работала нормально. Я не знаю, связано ли это с тем, что я включил его для «автозапуска» ( systemctl enable docker)
Лукас Поттерский

Кажется, не имеет отношения к вопросу ОП.
Кевин Бухс

Это так, потому что в описываемой ситуации OP перезагружает докер заново, инициализирует сетевые интерфейсы, и, следовательно, снова включает доступ в Интернет. Это правда, что это не связано с тем, ПОЧЕМУ оно иногда ломается, но оно обеспечивает решение проблемы.
битовая

Но в производственной среде перезапустить докер невозможно. Как решить проблему на этот случай?
Suyanhanx

22

Обновление этого вопроса с ответом для OSX (с помощью Docker Machine)

Если вы используете Docker на OSX, используя Docker Machine, то у меня сработало следующее:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

Тогда (по крайней мере, по моему опыту), если вы пингуете google.com из контейнера, все будет хорошо.


Также работал в Windows, чтобы снова получить доступ к сети.
Микаэль Леписто,

1
Это сработало для меня. У меня есть значок Docker в верхней строке меню, в меню у меня была опция «перезагрузка». После этого с сетью снова все было в порядке
olidem

8

Я не знаю, что я делаю, но это сработало для меня:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start

2
хорошая клейкая лента!
dctremblay

1
Ваш ответ помог решить подобную проблему. Я потратил на это часы! После неполной установки Kubespray контейнеры Docker теряли интернет с сообщением «Временное устранение неполадок» при попытке пропинговать любой общедоступный хост или IP. Так что у меня не было этого правила, которое является обязательным iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE. Вы можете проверить, есть ли у вас это правило сiptables -t nat -L POSTROUTING
laimison

6

Я использовал DOCKER_OPTS="--dns 8.8.8.8"и позже обнаружил, что мой контейнер не имел прямого доступа к Интернету, но мог получить доступ к моей корпоративной внутренней сети. Я изменил DOCKER_OPTSна следующее:

DOCKER_OPTS="--dns <internal_corporate_dns_address"

замена internal_corporate_dns_addressна IP-адрес или полное доменное имя нашего DNS и перезапущенный докер с помощью

sudo service docker restart

а затем породил мой контейнер и проверил, что он имеет доступ к интернету.


5

Я был в замешательстве, когда это произошло случайно для меня с одним из моих контейнеров, в то время как другие контейнеры были в порядке. Контейнер был подключен как минимум к одной не внутренней сети, так что с Composeопределением все в порядке. Перезапуск демона VM / docker не помог. Это также не было проблемой DNS, потому что контейнер не мог даже pingвнешний IP. Для меня это решило воссоздать сеть (и) докеров. В моем случае docker-compose down && docker-compose upсработало.

Compose

Это заставляет воссоздать все сети всех контейнеров:

docker-compose down && docker-compose up

Режим роя

Я полагаю, вы просто удалите и воссоздаете сервис, который воссоздает сеть (и) сервиса:

docker service rm some-service

docker service create ...

Если сеть контейнера (ов) являются внешними

Просто удалите и воссоздайте внешние сети этого сервиса:

docker network rm some-external-network

docker network create some-external-network


4

Для меня это был брандмауэр хоста. Я должен был разрешить DNS на брандмауэре хоста. А также пришлось перезапустить докер после изменения настроек брандмауэра хоста.


Или вы можете отключить iptables с помощью sudo service iptables stopи sudo chkconfig iptables off(на CentOS / RHEL).
MichaelZ

4

Отсутствие доступа в Интернет также может быть вызвано отсутствием настроек прокси . В этом случае --network hostможет не работать. Прокси-сервер можно настроить, задав переменные среды http_proxyи https_proxy:

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

Не забудьте также установить no_proxy, иначе все запросы (включая запросы к localhost) будут проходить через прокси.

Дополнительная информация: Настройки прокси в Archlinux Wiki.


1
Это было решением для меня. Но будьте осторожны: я использовал alpine, в которой реализована реализация wget с помощью busybox, которая игнорирует настройки прокси-сервера, поэтому я не вижу преимущества установки переменных окружения.
Пельсон

Спасибо за подсказку о busybox; Я еще не знал об этом!
Саймон А.

1
Имейте в виду, что некоторые ОС нуждаются в верхнем регистре, как в ссылке на документацию .
Фл

3

Для меня это было правило пересылки iptables. По некоторым причинам следующее правило в сочетании с правилами iptables докера вызывало попадание всего исходящего трафика из контейнеров localhost:8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3
Итак ... какое решение? :) У меня есть первое правило, и оно мне нужно для перенаправления входящего трафика на 80 на 8080. Как мне изменить это, чтобы не влиять на исходящий трафик?
mrooney

3

У меня была проблема на Ubuntu 18.04. Однако проблема была с DNS. Я был в корпоративной сети, которая имеет собственный DNS-сервер и блокирует другие DNS-серверы. Это блокировать некоторые сайты (порно, торренты, ... так далее)

Чтобы решить вашу проблему

  1. найти свой DNS на хост-машине
  2. используйте --dns your_dns как предложено @jobin

    запуск докера --dns your_dns -it --name cowsay --hostname cowsay debian bash


2

В Windows (8.1) я убил интерфейс virtualbox (через taskmgr), и это решило проблему.


2

Возможно, вы запустили свой докер с опциями DNS --dns 172.x.x.x

У меня была такая же ошибка и я удалил параметры из /etc/default/docker

Линии:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

2

Для Ubuntu 19.04, использующей openconnect 8.3 для VPN, мне пришлось использовать символическую ссылку /etc/resolve.conf на тот, что указан в systemd (в отличие от answerby wisbucky)

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

Шаги для отладки

  1. Подключение к компании VPN
  2. Найдите правильные настройки VPN в /etc/resolv.conf или /run/systemd/resolve/resolv.conf
  3. В зависимости от того, какие настройки DNS правильные, мы будем ссылаться на этот файл с другим файлом (подсказка: поместите файл с правильными настройками слева от назначения)

Версия Docker: версия Docker 19.03.0-rc2, сборка f97efcc


2
Спасибо. В Ubuntu 18.04 при подключении к корпоративной сети VPN только /etc/resolve.conf обновлялся через DHCP, а / run / systemd / resolution / resol / conf оставался постоянным / статическим. Это решение помогло. Теперь контейнеры на локальной машине подключаются к серверам в VPN (что раньше не происходило для меня)
dexter2305

1

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


1

Первоначально мой докер-контейнер мог подключаться к внешнему Интернету (это докер-сервис / контейнер, работающий на Amazon EC2).

Поскольку мое приложение представляет собой API, я следил за созданием своего контейнера (ему удалось вытащить все необходимые пакеты), обновив мои таблицы IP, чтобы направить весь трафик от порта 80 к порту, которым был мой API (работающий в Docker). слушаю дальше.

Затем, позже, когда я попытался восстановить контейнер, это не удалось. После долгой борьбы я обнаружил, что мой предыдущий шаг (настройка правила переадресации портов IPTable) испортил возможности внешней сети докера.

Решение. Остановите службу IPTable:

sudo service iptables stop

Перезапустите Docker Daemon:

sudo service docker restart

Затем попробуйте восстановить свой контейнер. Надеюсь это поможет.


Следовать за

Я полностью упустил из виду, что мне не нужно связываться с таблицами IP-адресов для пересылки входящего трафика на порт 80, на котором запущен API, работающий в докере. Вместо этого я просто связал порт 80 с портом, на котором работал API в Docker:

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>


1

Просто добавьте это здесь на тот случай, если кто-то столкнется с этой проблемой в контейнере virtualbox с запущенным Docker. Я перенастроил сеть виртуальной коробки на мостовую вместо nat, и проблема ушла.


1

для меня моя проблема была из-за того, что iptables-сервисы не были установлены, у меня это работало (CentOS):

sudo yum install iptables-services
sudo service docker restart

помните, что запуск и включение служб iptable также возможны
Jay

1

На centos 8 моя проблема заключалась в том, что я не установил и не запустил iptables до запуска службы Docker. Убедитесь, что служба iptables запущена и работает, прежде чем запускать службу Docker.


0

Я также столкнулся с такой проблемой при попытке настроить проект с помощью Docker-Compose в Ubuntu.

У Docker вообще не было доступа к Интернету, когда я пытался пропинговать любой IP-адрес или nslookup какой-то URL - он все время терпел неудачу.

Я пробовал все возможные решения с разрешением DNS, описанные выше, но безрезультатно.

Я потратил весь день, пытаясь выяснить, что происходит, и, наконец, выяснил, что причиной всех проблем был антивирус, в частности его брандмауэр, который по какой-то причине заблокировал Docker для получения IP-адреса и порта.

Когда я его отключил - все работало нормально.

Итак, если у вас установлен антивирус и ничего не помогает решить проблему - проблема может быть в брандмауэре антивируса.


0

У меня была похожая проблема за последние несколько дней. Для меня причиной стала комбинация systemd, docker и моего хостинг-провайдера. Я использую последнюю версию CentOS (7.7.1908).

Мой хостинг-провайдер автоматически создает файл конфигурации для systemd-networkd. Начиная с systemd 219, которая является текущей версией CentOS 7, systemd-networkd контролирует параметры sysctl, связанные с сетью. Docker, кажется, несовместим с этой версией и будет сбрасывать флаги IP-пересылки при каждом запуске контейнера.

Мое решение состояло в том, чтобы добавить IPForward=trueв [Network]раздел моего конфигурационного файла, созданного провайдером. Этот файл может быть в нескольких местах, скорее всего, в /etc/systemd/network.

Этот процесс также описан в официальных документах докера: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems


Не могли бы вы указать точное местоположение, в котором вы установили этот параметр? У меня точно такое же местоположение, как у вас, я использую виртуальную машину на облачной платформе Google и не могу найти файлы * .network на сервере. Только на /usr/lib/sysctl.d/50-default.confно синтаксис другой.
el.severo

Мой кластер управляется самостоятельно, и мой поставщик выполняет только начальную загрузку при настройке. Конфигурация сети была /etc/systemd/network/10-mainif.networkдля меня. Другие места , вы можете проверить это /usr/local/lib/systemd/и /usr/lib/systemd/в соответствии с Systemd страницы руководства.
BlackCetha

0

для меня при использовании centos 7.4 это не было проблемой /etc/resolve.conf, правил iptables, iptables nat или самого docker. Проблема заключается в том, что хосту не хватает пакета bridge-utils, который необходим докеру для построения моста с помощью команды brctl. yum установите -y bridge-utils и перезапустите докер, решите проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.