← Назад к вопросам

Можно ли редактировать DNS политику контейнера с помощью Docker CLI?

2.0 Middle🔥 231 комментариев
#Docker и контейнеризация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Редактирование DNS-политики контейнера через Docker CLI

Да, редактировать DNS политику контейнера с помощью Docker CLI не только возможно, но и является стандартной практикой при управлении контейнерами. Docker предоставляет несколько ключевых опций командной строки для настройки DNS-поведения контейнеров. Важно понимать, что большинство DNS-параметров задаётся при создании контейнера (команды docker run или docker create), а не во время его работы. Однако вы можете создать новый контейнер с обновлёнными настройками на основе существующего образа.

Основные параметры DNS в Docker CLI

Вот ключевые флаги, которые используются для управления DNS:

  1. --dns: Позволяет указать пользовательские DNS-серверы.

    docker run --dns 8.8.8.8 --dns 1.1.1.1 nginx
    
  2. --dns-opt и --dns-option: Задают параметры конфигурации DNS-резолвера (аналогично записям в /etc/resolv.conf).

    docker run --dns-opt "timeout:2" --dns-opt "attempts:3" nginx
    
  3. --dns-search: Добавляет домен поиска для коротких имён хостов.

    docker run --dns-search example.internal nginx
    
  4. --hostname: Устанавливает hostname контейнера, что влияет на DNS-записи внутри сети Docker.

    docker run --hostname mycontainer nginx
    
  5. --net (или --network): Выбор сети Docker напрямую влияет на DNS! Контейнеры в пользовательских сетях могут разрешать имена друг друга по имени контейнера.

    docker run --net my-custom-network nginx
    

Что такое DNS Policy и как её задать?

Сам термин DNS policy в документации Docker обычно относится к --dns-policy. Этот параметр управляет тем, как формируется файл /etc/resolv.conf внутри контейнера. Основные политики определяются через Docker Daemon, но клиентом можно задать:

  • Наследование от демона (default): Контейнер использует настройки из /etc/docker/daemon.json.
  • Полная переопределение: Используются только флаги --dns, --dns-search, --dns-opt, переданные в CLI. Это делается настройкой демона "dns-opts": ["use-vc"] или аналогичными, но прямо из CLI задать политику как единый переключатель нельзя.

Практический пример: конфигурация и проверка

Допустим, мы хотим запустить контейнер с двумя кастомными DNS-серверами, увеличенным таймаутом и внутренним доменом поиска.

# Запускаем контейнер с полным набором DNS-настроек
docker run -d --name test-dns \
  --dns 10.10.0.1 \
  --dns 10.10.0.2 \
  --dns-opt "timeout:5" \
  --dns-opt "attempts:2" \
  --dns-search "corp.local" \
  alpine sleep 3600

# Проверяем сформированный resolv.conf внутри контейнера
docker exec test-dns cat /etc/resolv.conf

# Выполняем тестовый запрос на разрешение имени
docker exec test-dns nslookup docker.com

Важные ограничения и нюансы

  • Динамическое обновление невозможно: DNS-параметры, заданные через CLI, фиксируются при создании контейнера. Для их изменения требуется пересоздать контейнер.
  • Приоритет конфигурации: Настройки из CLI имеют приоритет над настройками из daemon.json. Настройки daemon.json, в свою очередь, имеют приоритет над унаследованными от хоста (из /etc/resolv.conf).
  • DNS в Swarm/Kubernetes: В оркестраторах (Docker Swarm, Kubernetes) DNS-политика управляется иначе, через сервисные discovery-механизмы и соответствующие объекты (например, dnsConfig в Pod Spec).

Управление через Docker Daemon

Для глобальных настроек всех контейнеров используется конфигурационный файл демона /etc/docker/daemon.json:

{
  "dns": ["8.8.8.8", "8.8.4.4"],
  "dns-opts": ["ndots:2", "timeout:2"],
  "dns-search": ["internal.company"]
}

После изменения файла необходим перезапуск демона: sudo systemctl restart docker.

Заключение

Docker CLI предоставляет исчерпывающий набор инструментов для редактирования DNS-политики контейнера на этапе его создания. Вы можете гибко управлять серверами, опциями и доменами поиска. Для изменения настроек работающего контейнера его необходимо перезапустить с новыми параметрами, используя команду docker run с указанием всех требуемых флагов. Для массового управления удобнее использовать конфигурацию на уровне Docker Daemon через файл daemon.json. Понимание этих механизмов критически важно для построения отказоустойчивых и правильно работающих в сетевом взаимодействии микросервисных приложений.