У моего контейнера 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 инвалидов
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 варианта:
жесткий код DNS-сервера в Демоне.формат JSON. Это легко, но не идеально, если вы ожидаете, что DNS-сервер менять.
исправить хоста
/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
возможно, вы запустили свой докер с параметрами 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-серверы. Это для блокировки некоторых сайтов (порно, торренты,... так далее)
чтобы решить вашу проблему.
- найдите свой DNS на машине
использовать в DNS your_dns как было предложено by @jobin
настройки запустить-ДНС your_dns - it --name cowsay --hostname cowsay debian bash
Comments