Когда вы развертываете контейнер в сети, если он не может найти 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.
см. также:
- 🐳 3 довольно неизвестных команды Docker, которые помогут вам в самых различных ситуациях
- 🐳 Как подключиться к контейнеру Docker по ssh
- 🐳 Vulnhub – готовые уязвимые окружения Docker для обучения хакингу
- 🐳 Контейнер Docker: резервное копирование и восстановление
- 🐳 Примеры, как подключать контейнеры Docker к сети
- 🐳 Образы Docker для тестирования на проникновение и безопасности
- 🐳 Как минимизировать, оптимизировать и защитить контейнеры Docker с помощью DockerSlim
- 🐳 Как использовать Docker Bench for Security для аудита контейнеров
- 🐳 Как запускать команды внутри контейнера Docker?