У меня было все в порядке, но теперь это прекратилось. Я пробовал следующие команды безрезультатно:
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
отключен
sysctl -w net.ipv4.ip_forward=1
(на Centos 6)sysctl -w net.ipv4.ip_forward=1
/etc/resolv.conf
на хост- машинеsysctl -w net.ipv4.ip_forward=1
мне пришлось бежатьsudo service docker restart
.Ответы:
Первое, что нужно проверить, - запустить
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 варианта:Жесткий код DNS-сервера в daemon.json. Это легко, но не идеально, если вы ожидаете изменения DNS-сервера.
Починить хозяев
/etc/resolv.conf
. Это немного сложнее, но генерируется динамически, и вы не программируете DNS-сервер.1. Жесткий код DNS-сервера в Docker Daemon.json
редактировать
/etc/docker/daemon.json
Перезапустите демон 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
на хосте докер для копирования в контейнеры.источник
systemctl
(Ubuntu 14.04), попробуйте Как перезапустить сетевой сервис? и / или перезагрузите компьютер./etc/resolv.conf
контейнер в конструкцию, мне пришлось вручную скопировать файл в контейнер.Исправлено, следуя этому совету:
https://github.com/dotcloud/docker/issues/866#issuecomment-19218300
Кажется, интерфейс как-то «завис».
Обновление для более новых версий докера:
Вышеприведенный ответ все еще может выполнить работу за вас, но прошло довольно много времени с тех пор, как этот ответ был опубликован, и докер теперь более отточен, поэтому убедитесь, что вы сначала попробовали это, прежде чем углубляться в
iptables
и так далее.sudo service docker restart
или (если вы находитесь в дистрибутиве Linux, который не использует upstart)sudo systemctl restart docker
источник
docker -d
выходит из строя. Там нет-d
флага.ip link del docker0
docker -d
не существует в новых версиях. Вместо:service docker stop
тогдаdockerd
, тогдаservice docker start
Предполагаемый способ перезапустить Docker - это не делать это вручную, а использовать команду
service
or init:источник
systemctl enable docker
)Обновление этого вопроса с ответом для OSX (с помощью Docker Machine)
Если вы используете Docker на OSX, используя Docker Machine, то у меня сработало следующее:
Тогда (по крайней мере, по моему опыту), если вы пингуете google.com из контейнера, все будет хорошо.
источник
Я не знаю, что я делаю, но это сработало для меня:
источник
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
. Вы можете проверить, есть ли у вас это правило сiptables -t nat -L POSTROUTING
Я использовал
DOCKER_OPTS="--dns 8.8.8.8"
и позже обнаружил, что мой контейнер не имел прямого доступа к Интернету, но мог получить доступ к моей корпоративной внутренней сети. Я изменилDOCKER_OPTS
на следующее:замена
internal_corporate_dns_address
на IP-адрес или полное доменное имя нашего DNS и перезапущенный докер с помощьюа затем породил мой контейнер и проверил, что он имеет доступ к интернету.
источник
Я был в замешательстве, когда это произошло случайно для меня с одним из моих контейнеров, в то время как другие контейнеры были в порядке. Контейнер был подключен как минимум к одной не внутренней сети, так что с
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
источник
Для меня это был брандмауэр хоста. Я должен был разрешить DNS на брандмауэре хоста. А также пришлось перезапустить докер после изменения настроек брандмауэра хоста.
источник
sudo service iptables stop
иsudo chkconfig iptables off
(на CentOS / RHEL).Отсутствие доступа в Интернет также может быть вызвано отсутствием настроек прокси . В этом случае
--network host
может не работать. Прокси-сервер можно настроить, задав переменные средыhttp_proxy
иhttps_proxy
:Не забудьте также установить no_proxy, иначе все запросы (включая запросы к localhost) будут проходить через прокси.
Дополнительная информация: Настройки прокси в Archlinux Wiki.
источник
Для меня это было правило пересылки iptables. По некоторым причинам следующее правило в сочетании с правилами iptables докера вызывало попадание всего исходящего трафика из контейнеров
localhost:8080
:источник
У меня была проблема на Ubuntu 18.04. Однако проблема была с DNS. Я был в корпоративной сети, которая имеет собственный DNS-сервер и блокирует другие DNS-серверы. Это блокировать некоторые сайты (порно, торренты, ... так далее)
Чтобы решить вашу проблему
используйте --dns your_dns как предложено @jobin
запуск докера --dns your_dns -it --name cowsay --hostname cowsay debian bash
источник
В Windows (8.1) я убил интерфейс virtualbox (через taskmgr), и это решило проблему.
источник
Возможно, вы запустили свой докер с опциями DNS
--dns 172.x.x.x
У меня была такая же ошибка и я удалил параметры из
/etc/default/docker
Линии:
источник
Для Ubuntu 19.04, использующей openconnect 8.3 для VPN, мне пришлось использовать символическую ссылку /etc/resolve.conf на тот, что указан в systemd (в отличие от answerby wisbucky)
sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf
Шаги для отладки
Версия Docker: версия Docker 19.03.0-rc2, сборка f97efcc
источник
Если вы используете OSX, вам может потребоваться перезагрузить компьютер после установки Docker. Это было проблемой время от времени.
источник
Первоначально мой докер-контейнер мог подключаться к внешнему Интернету (это докер-сервис / контейнер, работающий на 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>
источник
Просто добавьте это здесь на тот случай, если кто-то столкнется с этой проблемой в контейнере virtualbox с запущенным Docker. Я перенастроил сеть виртуальной коробки на мостовую вместо nat, и проблема ушла.
источник
для меня моя проблема была из-за того, что iptables-сервисы не были установлены, у меня это работало (CentOS):
источник
На centos 8 моя проблема заключалась в том, что я не установил и не запустил iptables до запуска службы Docker. Убедитесь, что служба iptables запущена и работает, прежде чем запускать службу Docker.
источник
Я также столкнулся с такой проблемой при попытке настроить проект с помощью Docker-Compose в Ubuntu.
У Docker вообще не было доступа к Интернету, когда я пытался пропинговать любой IP-адрес или nslookup какой-то URL - он все время терпел неудачу.
Я пробовал все возможные решения с разрешением DNS, описанные выше, но безрезультатно.
Я потратил весь день, пытаясь выяснить, что происходит, и, наконец, выяснил, что причиной всех проблем был антивирус, в частности его брандмауэр, который по какой-то причине заблокировал Docker для получения IP-адреса и порта.
Когда я его отключил - все работало нормально.
Итак, если у вас установлен антивирус и ничего не помогает решить проблему - проблема может быть в брандмауэре антивируса.
источник
У меня была похожая проблема за последние несколько дней. Для меня причиной стала комбинация 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
источник
/usr/lib/sysctl.d/50-default.conf
но синтаксис другой./etc/systemd/network/10-mainif.network
для меня. Другие места , вы можете проверить это/usr/local/lib/systemd/
и/usr/lib/systemd/
в соответствии с Systemd страницы руководства.для меня при использовании centos 7.4 это не было проблемой /etc/resolve.conf, правил iptables, iptables nat или самого docker. Проблема заключается в том, что хосту не хватает пакета bridge-utils, который необходим докеру для построения моста с помощью команды brctl. yum установите -y bridge-utils и перезапустите докер, решите проблему.
источник