У моего контейнера docker нет интернета



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



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



какие идеи?



П. С. ufw инвалидов

2140   13  

13 ответов:

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

service docker restart

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

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

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

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

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

Кажется, интерфейс был "повешен" каким-то образом.

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

  1. жесткий код DNS-сервера в Демоне.формат JSON. Это легко, но не идеально, если вы ожидаете, что DNS-сервер менять.

  2. исправить хоста /etc/resolv.conf. Это немного сложнее, но он создается динамически, а не прописать DNS-сервер.


1. Задает DNS-сервер в docker daemon.json

  • Edit /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • перезапустите демон docker, чтобы эти изменения вступили в силу:
    sudo systemctl restart docker

  • теперь, когда вы запускаете/запускаете контейнер, docker будет заполнять /etc/resolv.conf со значениями от daemon.json.


2. Исправьте хосты /etc/resolv.conf

А. В 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

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

обновление этого вопроса с ответом для 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 из контейнера все будет хорошо.

Я был с помощью 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

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

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

для меня это было правило пересылки iptables. По какой-то причине следующее правило в сочетании с правилами iptables docker привело к тому, что весь исходящий трафик из контейнеров попал 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

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

возможно, вы запустили свой докер с параметрами 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"

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

отсутствие доступа в интернет также может быть вызвано отсутствием прокси настройки. В таком случае, --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.

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

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

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

решение: остановите службу IPTable:

sudo service iptables stop

Перезапустите Демон Docker:

sudo service docker restart

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


Последующие

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

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

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

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

  1. найдите свой DNS на машине
  2. использовать в DNS your_dns как было предложено by @jobin

    настройки запустить-ДНС your_dns - it --name cowsay --hostname cowsay debian bash

Comments

    Ничего не найдено.