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

«Можно ли настроить DNS для контейнера с помощью Docker CLI?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, Docker CLI предоставляет несколько флагов для тонкой настройки DNS-резолвинга для каждого контейнера. Это часто требуется в DevOps для работы в изолированных сетях, с внутренними DNS-серверами или для отладки.

Настройка при запуске контейнера (docker run):

  • --dns — указать custom DNS-серверы (можно несколько).
    docker run --dns 8.8.8.8 --dns 192.168.1.1 nginx
  • --dns-search — добавить суффиксы домена для поиска (например, чтобы web резолвилось в web.internal.company).
    docker run --dns-search "internal.company" --dns-search "svc.cluster.local" myapp
  • --dns-opt — передать опции в /etc/resolv.conf контейнера.
    # Увеличиваем таймаут и количество попыток
    docker run --dns-opt "timeout:3" --dns-opt "attempts:2" nginx
  • --hostname — задать hostname контейнера, который будет использоваться в DNS.

Глобальная настройка для Docker Daemon: Если нужно, чтобы все новые контейнеры использовали определенные настройки по умолчанию, их задают в /etc/docker/daemon.json:

{
  "dns": ["10.0.0.2", "8.8.8.8"],
  "dns-search": ["internal.example.com"],
  "dns-opts": ["timeout:2", "attempts:3"]
}

После изменения конфигурации требуется перезагрузка демона:

sudo systemctl reload docker  # или restart docker

Практический пример для корпоративной среды:

# Контейнер использует внутренний DNS для резолва сервисов,
# а для внешних запросов — публичный DNS Google.
# Также настроен поиск по внутреннему домену.
docker run 
  --dns 10.10.10.10 
  --dns 8.8.8.8 
  --dns-search "prod.aws.company" 
  --dns-opt "ndots:2" 
  --name my-service 
  my-app-image

Важно: Настройки, заданные через docker run, имеют приоритет над глобальными настройками демона. В Docker Compose эти параметры задаются в секции dns, dns_search, dns_opts для сервиса.