Alpine Linux Alpine Linux

Alpine: не работает разрешение имён внутри контейнера

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

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

Если ping по IP работает, а по имени нет, проблема в DNS: пустой resolv.conf, недоступный DNS-сервер или особенности musl при больших ответах. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Диагностика
  5. Постоянная настройка
  6. Docker и Kubernetes

#Что означает ошибка

Сообщение
ping: bad address / nslookup: can't resolve

В Alpine DNS настраивается через /etc/resolv.conf, но файл может быть перезаписан DHCP-клиентом или контейнерной средой. musl резолвер ведёт себя иначе, чем glibc: он опрашивает серверы параллельно, не поддерживает некоторые опции (search-расширения до недавних версий), а ответы с большими пакетами используют TCP.

Проверьте, откуда берётся файл и какие серверы указаны.

Затем протестируйте разрешение имён.

Если ping по IP работает, а по имени нет, проблема в DNS: пустой resolv.conf, недоступный DNS-сервер или особенности musl при больших ответах.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Пустой resolv.confНет nameserver.Добавьте.
DNS недоступенСеть.Проверьте.
Особенности muslОтветы TCP.Обновите.
Сеть контейнераDocker.Задайте --dns.

#Пошаговое решение

  1. Выведите /etc/resolv.confВ консоли Alpine или внутри контейнера выполните cat /etc/resolv.conf, чтобы посмотреть адреса DNS-серверов после строк nameserver. Если файл пуст или содержит недоступный адрес, выясните, кто его создал: сеть Alpine, DHCP, Docker или Kubernetes. В контейнере файл часто формируется системой запуска и ручная правка исчезнет при пересоздании. Перед заменой проверьте разрешение имён через следующий шаг.
  2. Проверьте разрешение nslookup/digВ терминале Alpine сначала проверьте связь по IP командой ping -c 3 1.1.1.1 (если сеть разрешает ICMP). Затем выполните nslookup example.org; при наличии dig можно использовать dig example.org. Если IP доступен, а имя не разрешается, проблема вероятнее в DNS. Если не работает даже IP, сначала проверяйте маршрут через ip route и подключение; не заменяйте файл /etc/resolv.conf наугад, поскольку он может управляться DHCP или NetworkManager.
  3. Задайте серверы вручную или через сетевой конфигВ Alpine откройте терминал и прочитайте cat /etc/resolv.conf, затем cat /etc/apk/repositories и ping -c 3 1.1.1.1. Проверьте, откуда сеть получает DNS (DHCP, NetworkManager или статическая настройка): ручное изменение /etc/resolv.conf часто временно и переписывается при подключении. На сервере SSH не меняйте сеть без резервного канала доступа.
  4. Для контейнеров настройте DNS в DockerЕсли проблема возникает только в Docker-контейнере, проверьте DNS на хосте и в контейнере: docker exec ИМЯ_КОНТЕЙНЕРА cat /etc/resolv.conf, заменив имя реальным из docker ps. Для одного сервиса в Docker Compose задавайте параметр dns: в его конфигурации с DNS-серверами, доступными из вашей сети, затем пересоздавайте только этот сервис в запланированное окно. Не редактируйте /etc/resolv.conf вручную внутри контейнера как постоянное решение.
  5. Учитывайте особенности muslВ Alpine используется библиотека musl, и её особенности разрешения имён могут отличаться от glibc. Если DNS по IP доступен, но отдельные имена не разрешаются только внутри контейнера, сравните nslookup ИМЯ_ХОСТА или getent hosts ИМЯ_ХОСТА на хосте и внутри Alpine. Проверьте версии Alpine и конфигурацию DNS в системе контейнеризации. Не устанавливайте glibc из неизвестных источников ради исправления DNS.
  6. Проверка настроек DNS и доступности сети
    Linux · Терминал (Bash)Команда
    Проверка настроек DNS и доступности сети.
    cat /etc/resolv.conf
    ping -c 2 8.8.8.8

#Диагностика

Выведите конфигурацию: cat /etc/resolv.conf. Проверьте: nslookup example.com (BusyBox) или apk add bind-tools && dig example.com. Тест связи: ping -c2 1.1.1.1 — если IP работает, а имя нет, проблема в DNS. Для контейнеров смотрите docker run --dns 1.1.1.1 и docker inspect. Проверьте сеть: ip a, ip route.

#Постоянная настройка

Для обычной системы Alpine: в /etc/network/interfaces для DHCP — DHCP-клиент сам запишет DNS; чтобы задать вручную, используйте udhcpc с -O либо файл /etc/udhcpc/udhcpc.conf с RESOLV_CONF="no", и запишите: echo "nameserver 1.1.1.1" > /etc/resolv.conf. Через setup-dns: setup-dns. Для статического адреса в /etc/network/interfaces добавьте dns-nameservers 1.1.1.1 8.8.8.8 (нужен пакет openresolv: apk add openresolv).

#Docker и Kubernetes

В контейнере файл генерирует Docker: задайте --dns, dns: в compose или daemon.json ("dns": ["1.1.1.1"]). Проверка в Kubernetes: cat /etc/resolv.conf (CoreDNS), параметр ndots:5 увеличивает число запросов; для musl с длинными search-доменами используйте полное имя с точкой (service.ns.svc.cluster.local.). Если ответ медленный, проверьте UDP/TCP 53 и MTU.

ТекстКоманда
Убрана непостоянная перезапись resolv.conf в контейнере, оставлена диагностика DNS.
cat /etc/resolv.conf
nslookup apple.com

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

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

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