🐳 Как определить DNS в контейнерах Docker

Мануал

Когда вы развертываете контейнер в сети, если он не может найти DNS-сервер, определенный в файле /etc/resolv.conf, по умолчанию он будет использовать DNS, настроенный для хоста.

Это может быть хорошо и удобно для определенных ситуаций.

Но что если (возможно, по соображениям безопасности) вы не хотите, чтобы ваши контейнеры использовали тот же DNS, что и хосты.

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

🐳 Как узнать IP-адрес Docker контейнера

Или, может быть, у вас разные конфигурации DNS для VPN.

Может быть множество причин, по которым вы не захотите, чтобы ваши контейнеры использовали тот же DNS, что и их хосты.

Итак, что же делать? Как определить DNS для контейнеров Docker, чтобы они не использовали DNS хоста?

На самом деле это довольно просто. Сейчас я покажу вам, как это сделать.

Чтобы все получилось, вам понадобится машина с движком Docker.

Я буду демонстрировать на Ubuntu Server 20.04, но платформа хоста  не имеет значения, если у вас запущен Docker и вы можете развертывать контейнеры.

Вам также понадобится пользователь, входящий в группу docker (чтобы вы не разворачивали контейнеры от имени пользователя root или с помощью sudo, что является проблемой безопасности).

Как использовать Docker без sudo на Ubuntu

Когда все это готово, приступаем к развертыванию.

Как развернуть контейнер с предварительно настроенным DNS

Я собираюсь показать вам, как развернуть контейнеры Docker с предварительно настроенным DNS.

В первом случае будет использоваться командой docker, а во втором – Docker Compose.

Допустим, вы хотите развернуть контейнер Ubuntu с именем ubuntuDNS с основным DNS-сервером Cloudflare 1.0.0.1.

Эта команда будет выглядеть следующим образом:

docker run -d -t --name ubuntuDNS --dns="1.0.0.1" ubuntu

Вы также можете развернуть этот контейнер с первичным и вторичным DNS следующим образом:

docker run -d -t --name ubuntuDNS --dns="1.0.0.1" --dns="1.1.1.1" ubuntu

Давайте убедимся, что контейнер принимает нашу конфигурацию DNS.

Для этого зайдите в оболочку контейнера с помощью команды:

docker exec -it ubuntuDNS bash

Из оболочки выполните команду:

cat /etc/resolv.conf

Вы должны увидеть DNS-сервер(ы), которые вы настроили из командной строки!

Выйдите из оболочки с помощью команды exit.

Теперь мы сделаем то же самое, используя Docker Compose.

Конечно, необходимо, чтобы он был установлен, что можно сделать следующим образом:

wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
chmod u+x docker-compose-Linux-x86_64
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

Установив Docker Compose, вы можете создать необходимый файл с помощью команды:

nano docker-compose.yaml

В этом файле развернем контейнер rabbitmq (брокер сообщений с открытым исходным кодом), который будет использовать DNS-запись CloudFlare, которая будет выглядеть следующим образом:

version: '3'
services:
  service:
    dns:
      - "1.0.0.1"
           - "1.1.1.1"
    network_mode: "bridge"
    image: rabbitmq:3-management
    container_name: rabbitmq
    hostname: rabbitmq
    ports:
      - "15672:15672"

Примечание: Без опции network_mode, установленной на “bridge”, запись DNS не будет работать.

Сохраните и закройте файл.

Разверните контейнер с помощью команды:

docker-compose up

Откройте новое SSH-соединение с сервером хоста (поскольку развертывание не вернет вам запрос), а затем зайдите в оболочку контейнера rabbitmq с помощью команды:

docker exec -it rabbitmq bash

Находясь внутри контейнера, просмотрите записи DNS с помощью команды:

cat /etc/resolv.conf

И это все, что нужно для определения DNS в ваших контейнерах Docker.

см. также:

 

Добавить комментарий