Ubuntu Ubuntu Linux

Ubuntu Linux: в контейнере нет доступа к DNS при работающей сети хоста

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Контейнер на Ubuntu не может разрешать доменные имена, хотя тот же домен открывается на хосте. Пример разбора рассчитан прежде всего на Docker; для LXD, Podman и Kubernetes команды и механизм DNS отличаются. Нельзя считать отсутствие ping доказательством DNS-ошибки.

В этой статье
  1. Что означает проблема и кому подходит инструкция
  2. Возможные причины и отличительные признаки
  3. Диагностика и пошаговое устранение
  4. Как убедиться, что неисправность устранена
  5. Если результат не получен

#Что означает проблема и кому подходит инструкция

Контейнер на Ubuntu не может разрешать доменные имена, хотя тот же домен открывается на хосте. Пример разбора рассчитан прежде всего на Docker; для LXD, Podman и Kubernetes команды и механизм DNS отличаются. Нельзя считать отсутствие ping доказательством DNS-ошибки.

#Возможные причины и отличительные признаки

Возможная причинаКак узнатьЧто делать
Резолвер контейнера указывает на недоступный адрес127.0.0.53 на хосте или 127.0.0.1 внутри контейнера ссылается на другое сетевое пространство.В /etc/resolv.conf внутри контейнера неверный nameserver.Проверить механизм DNS Docker и доступность исходного резолвера.
Docker DNS пересылает на недоступный серверВ пользовательской сети Docker встроенный DNS 127.0.0.11 не может найти внешний адрес.IP-соединение есть, getent hosts не работает.Проверить upstream и сетевые политики хоста.
Контейнер не имеет маршрута/доступа наружуПроблема шире DNS.Даже обращение к IP не работает.Разбирать маршрутизацию и ограничения сети контейнера отдельно.

#Диагностика и пошаговое устранение

  1. 1. Определите систему контейнеровНа хосте Ubuntu выполните docker ps только если действительно используется Docker. Посмотрите имя нужного контейнера, тип сети и сеть, к которой он подключён. Для Kubernetes эту инструкцию Docker не применяйте без адаптации: сервисы DNS там управляются кластером.
    Linux · Терминал (Bash)Команда
    Команда требует членства в группе docker или прав администратора; членство в docker эквивалентно высоким привилегиям.
    docker ps
    docker network ls
  1. 2. Сравните результат на хосте и в контейнереНа хосте выполните getent hosts example.com. Затем в нужном контейнере при наличии getent выполните такую же проверку; если утилита не установлена, используйте штатное приложение для запроса DNS. Не устанавливайте диагностические пакеты в боевой контейнер без понимания неизменяемого образа.
    Linux · Терминал (Bash)Команда
    Пример команды для Linux-образа с getent; подставьте имя контейнера.
    getent hosts example.com
    docker exec ИМЯ_КОНТЕЙНЕРА getent hosts example.com
  1. 3. Посмотрите настройки DNS внутри DockerПри наличии в контейнере обычного /etc/resolv.conf прочитайте его через docker exec. В стандартной сети Docker обычно копирует DNS, а в пользовательских сетях использует встроенный 127.0.0.11, который передаёт запросы дальше. 127.0.0.11 сам по себе не ошибка.
    Linux · Терминал (Bash)Команда
    Не редактируйте временный resolv.conf внутри контейнера: при пересоздании правка исчезнет.
    docker exec ИМЯ_КОНТЕЙНЕРА cat /etc/resolv.conf
    cat /etc/resolv.conf
  1. 4. Проверьте сеть и источники имён хостаНа Ubuntu проверьте resolvectl status, маршруты и работающий системный DNS. Если VPN подключился после создания контейнера, могли измениться доступные DNS и маршруты. Для частных доменов проверьте, доступен ли корпоративный сервер с хоста.
    Linux · Терминал (Bash)Команда
    Имя сети возьмите из docker network ls; вывод может содержать внутренние адреса.
    resolvectl status
    ip route
    docker network inspect ИМЯ_СЕТИ
  1. 5. Внесите корректное изменение на уровне запуска контейнераЕсли доказано, что проблема только в upstream DNS, задайте доступный разрешённый DNS через параметр Docker --dns при пересоздании контейнера либо через конфигурацию развёртывания (Compose); не подменяйте сеть чужим публичным DNS при VPN. Сохраните сведения о томах, переменных и портах до пересоздания: простое удаление контейнера может потерять данные, если они не вынесены в постоянное хранилище.
    Linux · Терминал (Bash)Команда
    Только просмотр параметров контейнера; пересоздание делается администратором по отдельному плану.
    docker inspect ИМЯ_КОНТЕЙНЕРА
  1. 6. Проверяйте после пересоздания и смены сетиПосле исправления конфигурации разрешения имён убедитесь, что getent возвращает адрес с нового контейнера и реальное приложение выходит в сеть. Затем проверьте работу с VPN и после перезапуска Docker. Если по IP нет подключения, возвращайтесь к маршрутизации, а не меняйте DNS снова.
  2. Контейнер должен быть уже запущен и содержать getent
    Linux · Терминал (Bash)Команда
    Контейнер должен быть уже запущен и содержать getent.
    docker exec ИМЯ_КОНТЕЙНЕРА getent hosts example.com

#Как убедиться, что неисправность устранена

Решение подтверждается после пересоздания контейнера с сохранёнными данными: внешние и нужные внутренние имена разрешаются, приложение подключается к требуемым адресам. Этот сценарий не предназначен для диагностики Kubernetes CoreDNS.

#Если результат не получен

Не повторяйте опасные действия наугад. Сохраните точную формулировку ошибки, вывод диагностики без секретов, версию Ubuntu и данные о затронутом компоненте. Верните лишь собственные изменения из резервной копии; если затронута загрузка, диски или рабочий сервер, воспользуйтесь консолью восстановления либо помощью администратора.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.