#Когда возникает проблема и к каким системам относится
В контейнере сеть по IP работает, но имена не находятся. Важны его resolv.conf, сетевой backend Podman и внутренняя DNS-служба, а не только DNS хоста. Rocky Linux 8/9/10 с Podman или Docker; команды для Podman показаны отдельно, не переносите их автоматически на Docker и Kubernetes.
#Основные причины: как отличить одну от другой
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Контейнер получил неправильный DNSВнутренний /etc/resolv.conf содержит недоступный адрес | getent работает на хосте, в контейнере — нет | Сопоставить конфигурацию Podman и DNS сети |
| Сбой внутреннего DNS podmanДля пользовательской сети не разрешаются имена соседних контейнеров | podman network inspect сообщает dns_enabled/настройки | Проверить сеть и backend aardvark-dns |
| Отличие rootless сетиКонтейнер исполняется не от root, DNS и namespace иные | podman info указывает rootless | Настраивать DNS именно нужному пользователю |
#Пошаговая диагностика и устранение неисправности
- Шаг 1. Сначала подтвердите DNS-сбой на хостеОткройте терминал именно хоста Rocky Linux, проверьте разрешение публичного имени. Если оно уже не работает на хосте, начните с NetworkManager, иначе изменения контейнера бессмысленны.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
getent ahostsv4 rockylinux.orgnmcli -f NAME,DEVICE connection show --active
- Шаг 2. Определите контейнер и способ его запускаСмотрите список Podman от того же пользователя, который владеет контейнером. sudo podman ps отображает другую группу контейнеров. Для Docker используйте его документацию и docker ps, а не Podman-команды.Linux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
podman ps --format "{{.ID}} {{.Names}} {{.Networks}}"podman info --format "{{.Host.Security.Rootless}}"
- Шаг 3. Прочитайте DNS непосредственно внутри контейнераЗамените ИМЯ_КОНТЕЙНЕРА настоящим именем. Если в образе нет getent или sh, это нормально для минимального образа; проверку нужно выполнить поддерживаемой утилитой приложения, не устанавливая случайно пакет в работающий контейнер.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
CON="ИМЯ_КОНТЕЙНЕРА"podman exec "$CON" cat /etc/resolv.confpodman exec "$CON" getent hosts rockylinux.org
- Шаг 4. Узнайте, к какой сети подключён контейнерinspect покажет сеть и конфигурацию DNS, по которым он запущен. Не отключайте мост или сеть для всех контейнеров ради одного; сначала поймите, требует ли приложение разрешения имён других контейнеров или публичного DNS.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
CON="ИМЯ_КОНТЕЙНЕРА"podman inspect "$CON" --format "{{json .NetworkSettings.Networks}}"podman network ls
- Шаг 5. Проверьте настройки конкретной сетиВ следующем шаге замените имя сети результатом inspect. В сети Podman встроенное DNS-разрешение имён контейнеров зависит от backend, режима сети и параметра dns_enabled. Не делайте вывод лишь из адреса 127.0.0.1 внутри контейнера: это его собственный namespace.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
NET="ИМЯ_СЕТИ"podman network inspect "$NET"
- Шаг 6. Сравните rootless с rootful без переключения правrootless Podman и rootful Podman имеют разные области хранения и сетевые процессы. Если контейнер обслуживается systemd пользователя, изменения конфигурации root не затронут его. Заданный при создании --dns может не обновиться для уже созданного контейнера.Linux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
podman info --debug | grep -Ei "rootless|networkBackend|network backend" | head -30id
- Шаг 7. Применяйте DNS только после доказательства причиныДля вновь создаваемого тестового контейнера можно указать DNS, утверждённый администратором, но не размещайте публичный DNS в корпоративной сети без согласования. После корректировки конфигурации пересоздайте только целевой контейнер из его описания/манифеста, не удаляя тома; затем повторите getent из него.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
CON="ИМЯ_КОНТЕЙНЕРА"podman exec "$CON" cat /etc/resolv.confpodman exec "$CON" getent hosts rockylinux.org
#Как убедиться, что неисправность устранена
Именное разрешение работает в конкретном контейнере; приложение может соединяться с требуемыми узлами и продолжает это делать после штатного пересоздания.
#Если предложенный способ не сработал
Если контейнер запускается не Podman или использует Kubernetes, сверяйте DNS с его оркестратором; приложите podman inspect и resolv.conf без секретов, не меняйте общесистемный DNS наугад.