#Что означает проблема и кому подходит инструкция
Контейнер на 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. Определите систему контейнеровНа хосте Ubuntu выполните
docker psтолько если действительно используется Docker. Посмотрите имя нужного контейнера, тип сети и сеть, к которой он подключён. Для Kubernetes эту инструкцию Docker не применяйте без адаптации: сервисы DNS там управляются кластером.Linux · Терминал (Bash)КомандаКоманда требует членства в группе docker или прав администратора; членство в docker эквивалентно высоким привилегиям.docker psdocker network ls
- 2. Сравните результат на хосте и в контейнереНа хосте выполните
getent hosts example.com. Затем в нужном контейнере при наличии getent выполните такую же проверку; если утилита не установлена, используйте штатное приложение для запроса DNS. Не устанавливайте диагностические пакеты в боевой контейнер без понимания неизменяемого образа.Linux · Терминал (Bash)КомандаПример команды для Linux-образа с getent; подставьте имя контейнера.getent hosts example.comdocker exec ИМЯ_КОНТЕЙНЕРА getent hosts example.com
- 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.confcat /etc/resolv.conf
- 4. Проверьте сеть и источники имён хостаНа Ubuntu проверьте
resolvectl status, маршруты и работающий системный DNS. Если VPN подключился после создания контейнера, могли измениться доступные DNS и маршруты. Для частных доменов проверьте, доступен ли корпоративный сервер с хоста.Linux · Терминал (Bash)КомандаИмя сети возьмите из docker network ls; вывод может содержать внутренние адреса.resolvectl statusip routedocker network inspect ИМЯ_СЕТИ
- 5. Внесите корректное изменение на уровне запуска контейнераЕсли доказано, что проблема только в upstream DNS, задайте доступный разрешённый DNS через параметр Docker
--dnsпри пересоздании контейнера либо через конфигурацию развёртывания (Compose); не подменяйте сеть чужим публичным DNS при VPN. Сохраните сведения о томах, переменных и портах до пересоздания: простое удаление контейнера может потерять данные, если они не вынесены в постоянное хранилище.Linux · Терминал (Bash)КомандаТолько просмотр параметров контейнера; пересоздание делается администратором по отдельному плану.docker inspect ИМЯ_КОНТЕЙНЕРА
- 6. Проверяйте после пересоздания и смены сетиПосле исправления конфигурации разрешения имён убедитесь, что
getentвозвращает адрес с нового контейнера и реальное приложение выходит в сеть. Затем проверьте работу с VPN и после перезапуска Docker. Если по IP нет подключения, возвращайтесь к маршрутизации, а не меняйте DNS снова. - Контейнер должен быть уже запущен и содержать getentLinux · Терминал (Bash)КомандаКонтейнер должен быть уже запущен и содержать getent.
docker exec ИМЯ_КОНТЕЙНЕРА getent hosts example.com
#Как убедиться, что неисправность устранена
Решение подтверждается после пересоздания контейнера с сохранёнными данными: внешние и нужные внутренние имена разрешаются, приложение подключается к требуемым адресам. Этот сценарий не предназначен для диагностики Kubernetes CoreDNS.
#Если результат не получен
Не повторяйте опасные действия наугад. Сохраните точную формулировку ошибки, вывод диагностики без секретов, версию Ubuntu и данные о затронутом компоненте. Верните лишь собственные изменения из резервной копии; если затронута загрузка, диски или рабочий сервер, воспользуйтесь консолью восстановления либо помощью администратора.