n1ro°
RU

Текст и данные · Инструкция

Docker --dns: задать DNS-серверы контейнеру

Собственный DNS нужен, когда контейнер должен обращаться к корпоративной зоне, тестовому резолверу или обходить неподходящую конфигурацию хоста.

Редакция N1RO · Проверено

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

Передайте один или несколько --dns=<IP> при запуске контейнера. Если нужна поисковая зона или дополнительные resolver options, используйте также.

Что важно понять до начала

Docker поддерживает повторяемый флаг `--dns` для нескольких resolver-адресов. `--dns-search` задаёт домены поиска, а `--dns-option` — параметры resolver. IP DNS-сервера должен быть достижим из сетевого namespace контейнера. Проверять нужно отдельно резолвинг имени и доступ к полученному IP.

Совет: Практический ориентир: Да, повторите `--dns` для каждого IP. Порядок и фактическое использование также зависят от resolver внутри образа.

Пошаговый порядок действий

  1. 1. Проверьте DNS вне контейнера и запишите IP нужных resolver-серверов.
  2. 2. Запустите контейнер, например с двумя `--dns` для основного и резервного сервера.
  3. 3. Внутри контейнера выполните `getent hosts example.com` или доступный DNS-клиент.
  4. 4. Если внешний домен работает, а внутренняя короткая запись нет, добавьте корректный `--dns-search`.
  5. 5. Проверьте, что firewall/VPN не блокирует UDP/TCP 53 от Docker-сети.

Важно: Критично для этой задачи: Не прописывайте публичный DNS как универсальное исправление для корпоративных имён: он может лишить контейнер доступа к split-DNS зонам.

Ошибки и пограничные случаи

Не прописывайте публичный DNS как универсальное исправление для корпоративных имён: он может лишить контейнер доступа к split-DNS зонам. На user-defined networks Docker использует встроенную DNS-службу для имён контейнеров; ручной `--dns` нужен прежде всего для upstream resolution и не заменяет корректную Docker-сеть.

Предупреждение: Пограничный случай: Не обязательно. `--dns` позволяет задать resolver только конкретному контейнеру.

Проверка перед завершением

  • Проверьте DNS вне контейнера и запишите IP нужных resolver-серверов.
  • Внутри контейнера выполните `getent hosts example.com` или доступный DNS-клиент.
  • Проверьте, что firewall/VPN не блокирует UDP/TCP 53 от Docker-сети.
  • Проверено отдельно: Да, повторите `--dns` для каждого IP. Порядок и фактическое использование также зависят от resolver внутри образа.

Практический сценарий и контроль результата

После изменения DNS разделяйте три проверки: доступность самого resolver по сети, разрешение имени и соединение с полученным IP. Это быстрее показывает, где ломается цепочка. Для внутренних коротких имён отдельно проверяйте search domain; рабочий публичный домен ещё не доказывает, что корпоративная зона настроена правильно. Если проблема возникает только через VPN, повторите тест из контейнера именно в подключённом состоянии — маршрутизация и firewall для Docker‑сети могут отличаться от хоста.

Дополнительные нюансы и проверка

Для диагностики полезно проверять короткое внутреннее имя и полное доменное имя отдельно. Если FQDN разрешается, а короткое имя нет, проблема чаще в search domain, а не в самом DNS‑сервере. Если не разрешается ничего, сначала проверьте достижимость resolver из контейнера. Не делайте вывод по ping: некоторые сети блокируют ICMP, а DNS при этом работает. Лучше использовать getent, nslookup или другой доступный resolver‑клиент внутри того же образа. Если DNS нужен только одному сервису, не меняйте resolver всего хоста. Локальная настройка контейнера уменьшает радиус изменений и упрощает откат.

Что учитывать

Docker поддерживает повторяемый флаг `--dns` для нескольких resolver-адресов. `--dns-search` задаёт домены поиска, а `--dns-option` — параметры resolver. IP DNS-сервера должен быть достижим из сетевого namespace контейнера. Проверять нужно отдельно резолвинг имени и доступ к полученному IP.

Источники и проверка

Фактическая часть сверена по первичным источникам (в т.ч. docker container run). Пример и формулировки — редакция N1RO на 2026-09-22.