#Как выглядит неисправность
Внутри контейнера не разрешаются доменные имена, хотя хост имеет доступ к сети. Нужно разделить ошибку DNS и проблему маршрутизации: сбой имени не равен полному отсутствию сети.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| DNS-резолвер контейнера недоступенgetent hosts выдаёт ошибку, но связь по IP есть | nameserver в /etc/resolv.conf не отвечает | Проверить сеть Docker и DNS хоста |
| Прокси/VPN меняет DNS хостаКонфигурация сети хоста изменилась после старта Docker | Несколько контейнеров одновременно потеряли резолвинг | Согласовать DNS демона/сети, пересоздать тестовый контейнер |
#Пошаговое устранение
- 1. Выберите конкретный контейнер и проверьте симптомыВ терминале с доступом к Docker выполните docker ps, затем docker logs --tail 50 ИМЯ. Найдите ENOTFOUND, Temporary failure in name resolution или сообщение резолвера. Если ошибка TLS/HTTP, это другая проблема.Linux · Терминал (Bash)КомандаЧтение состояния, не меняет сеть.
docker psdocker logs --tail 50 ИМЯ
- 2. Проверьте имя на самом хостеНа Linux-хосте запустите getent hosts example.org, на Windows проверьте Resolve-DnsName example.org в PowerShell. Если хост также не разрешает имя, сначала разберите настройки сети хоста — Docker тут может быть ни при чём.Linux · Терминал (Bash)КомандаLinux-хост; выводит IP при исправном разрешении имени. Если нет getent, используйте штатный инструмент системы.
getent hosts example.org
- 3. Посмотрите DNS в контейнереЗапустите docker exec ИМЯ cat /etc/resolv.conf (для Linux-образов). В пользовательской сети часто встречается встроенный 127.0.0.11, что нормально. Если cat отсутствует в минимальном образе, изучите конфигурацию через docker inspect, а не устанавливайте утилиты в рабочий контейнер.Linux · Терминал (Bash)КомандаТолько чтение, команда cat может отсутствовать в distroless-образе.
docker exec ИМЯ cat /etc/resolv.conf
- 4. Уточните тип сетиПроверьте docker inspect --format ... ИМЯ и имя используемой сети. Убедитесь, что контейнер не запущен с network_mode: none и не отключён от нужной сети. На macOS/Windows Docker Desktop сеть устроена иначе, чем в Linux.Linux · Терминал (Bash)КомандаТолько чтение; показывает имена сетей и IP.
docker inspect --format '{{json .NetworkSettings.Networks}}' ИМЯ
- 5. Повторите проверку в отдельном тестовом контейнереСоздайте тестовый контейнер с образом, который уже одобрен организацией, в той же сети и выполните getent hosts example.org. Если в тестовой копии DNS работает, исследуйте настройки и приложение исходного контейнера, а не меняйте весь Docker.
- 6. Исправьте источник DNS согласно своей сетиЕсли DNS хоста компании требует внутренние серверы, согласуйте их с администратором и задайте dns: для конкретного сервиса в compose.yaml либо настройку демона по правилам инфраструктуры. После проверки docker compose config пересоздайте только тестовый сервис и повторите запрос.
- 7. Проверьте восстановление приложенияОткройте прежний URL или повторите безопасный запрос приложения, проверьте отсутствие ENOTFOUND в свежих журналах. Если сбой повторяется только через VPN, проверьте его DNS и маршруты с сетевым администратором.
#Как проверить результат
Успех: имя разрешается в контейнере и запрос к целевому сервису проходит. Запрос по IP без DNS сам по себе не доказывает исправления.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.