#Когда возникает ошибка в Debian и какие условия важны
Контейнер Docker на Debian не открывает домены, хотя хостовая система успешно обращается к ним. DNS контейнера зависит от режима сети, конфигурации Docker Engine и назначения серверов; адрес 127.0.0.1 внутри контейнера указывает на сам контейнер, а не на хост.
#Причины и как отличить их друг от друга
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Контейнер использует неработающий DNS | Хост разрешает имя, внутри ошибка temporary failure in name resolution. | Сравнить /etc/resolv.conf контейнера и режим сети. |
| В сети контейнера нет выхода | Даже соединение к разрешённому IP не работает. | Проверить маршрут, bridge и межсетевой экран до DNS. |
| Собственная настройка переопределяет DNS | В docker inspect или compose задан dns, конфликтующий с доступной сетью. | Исправить источник настроек и пересоздать тестовый контейнер. |
#Пошаговая диагностика и устранение
- 1. Проверьте имя нужного контейнера и режим сетиВ терминале Debian на хосте убедитесь, что установлен Docker и вы авторизованы для его управления. docker ps покажет имена и состояние; членство в группе docker фактически даёт привилегии уровня root, поэтому не добавляйте туда пользователей ради удобства диагностики.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
docker ps --format "table {{.Names}}\t{{.Status}}"docker network ls
- 2. Убедитесь, что на самом хосте разрешение доменов работаетВыполните getent ahostsv4 для проверочного имени и откройте /etc/resolv.conf на хосте. Если уже здесь ошибка, надо сначала исправить сеть Debian, а не менять Docker. При запрете доступа к внешним доменам используйте разрешённое внутреннее доменное имя.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
getent ahostsv4 debian.orgcat /etc/resolv.conf
- 3. Сверьте DNS и сеть внутри работающего контейнераУкажите настоящее ИМЯ_КОНТЕЙНЕРА. Команда docker exec cat читает resolv.conf без изменения данных, но в некоторых минимальных образах может отсутствовать даже cat; тогда inspect покажет настройки сети. Не подменяйте /etc/resolv.conf через docker exec: при перезапуске он будет создан снова.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
docker exec ИМЯ_КОНТЕЙНЕРА cat /etc/resolv.confdocker inspect --format "{{.HostConfig.NetworkMode}}" ИМЯ_КОНТЕЙНЕРА
- 4. Определите, задан ли собственный DNS приложениюКоманда inspect выводит только сетевой режим и поле Dns, не раскрывая остальные потенциально секретные переменные контейнера. Пустой список обычно означает наследование политики Docker, но не доказывает, что DNS достижим. Для сети user-defined bridge Docker может применять встроенный DNS по 127.0.0.11.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
docker inspect --format "{{json .HostConfig.Dns}}" ИМЯ_КОНТЕЙНЕРАdocker inspect --format "{{json .NetworkSettings.Networks}}" ИМЯ_КОНТЕЙНЕРА
- 5. Не перепутайте DNS и отсутствие маршрута наружуСравните доступ из контейнера к IP-адресу разрешённого сервиса и к его имени через штатное приложение, если в образе есть curl или wget. Ошибка по обоим путям указывает на сеть/firewall, а не только DNS. Не ставьте инструменты в рабочий контейнер автоматически — это меняет образ среды.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
docker network inspect bridge
- 6. Проверьте, где хранится конфигурация Docker EngineНа обычном Linux сервере файл демона — /etc/docker/daemon.json. Если в нём задан ключ dns, выясните, откуда взяты адреса и доступны ли они по сети контейнера; в rootless режиме путь иной. Перед редактированием сохраните копию файла, не перезапускайте Docker на производстве без оценки влияния на запущенные приложения.
- Если конфигурационного файла нет, это допустимо; не создавайте его без причиныLinux · Терминал (Bash)КомандаНужен sudoЕсли конфигурационного файла нет, это допустимо; не создавайте его без причины.
sudo cat /etc/docker/daemon.jsonsystemctl status docker --no-pager
- 7. Проверьте решение на изолированном тестеПосле согласованного исправления настроек сети приложения запустите штатную проверку DNS внутри того же контейнера или нового безвредного тестового, уже имеющего нужную утилиту. Контролируйте разрешение имени и реальное сетевое соединение отдельно; если результат временный, проверьте DNS в compose и при перезапуске контейнера.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
docker exec ИМЯ_КОНТЕЙНЕРА cat /etc/resolv.confgetent ahosts debian.org
#Проверка результата и действия при неуспехе
Успех — именно контейнер разрешает нужные имена и устанавливает сетевое соединение после пересоздания или перезапуска, а работа остальных контейнеров не нарушена.