Настройка Docker Dnsmasq

Я пытаюсь настроить Docker-контейнер dnsmasq, чтобы все мои Docker-контейнеры могли искать доменные имена, а не иметь жестко запрограммированные IP-адреса (если они находятся на одном хосте). Это устраняет проблему с тем фактом, что нельзя изменить файл / etc / hosts в контейнерах Docker, и это позволяет мне легко обновлять все мои контейнеры за один раз, изменяя один файл, на который ссылается контейнер dnsmasq.

Похоже, кто-то уже сделал тяжелую работу за меня и создал контейнер dnsmasq. К сожалению, это не "работает" для меня. Я написал скрипт bash для запуска контейнера, как показано ниже:

name="dnsmasq_"
timenow=$(date +%s)
name="$name$timenow"

sudo docker run \
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \
--name=$name \
-p='127.0.0.1:53:5353/udp' \
-d sroegner/dnsmasq

Перед запуском я создал каталог dnsmasq.hosts и вставил в него один файл hosts.txt со следующим содержимым:

192.168.1.3 database.mydomain.com

К сожалению, когда я пытаюсь пропинговать этот домен изнутри:

  • гостья
  • Контейнер dnsmasq
  • другой контейнер на том же хосте

Я всегда получаю ping: unknown host сообщение об ошибке.

Я попытался запустить контейнер dnsmasq без режима демона, чтобы отладить его вывод, который приведен ниже:

dnsmasq: started, version 2.59 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n DHCP TFTP conntrack IDN
dnsmasq: reading /etc/resolv.dnsmasq.conf
dnsmasq: using nameserver 8.8.8.8#53
dnsmasq: read /etc/hosts - 7 addresses
dnsmasq: read /dnsmasq.hosts//hosts.txt - 1 addresses

Я предполагаю, что я не указал -p параметр правильно при запуске контейнера. Может кто-нибудь сказать мне, что должно быть для других контейнеров докера для поиска DNS, или то, что я пытаюсь сделать, на самом деле невозможно?

1 ответ

Решение

Сценарий сборки для службы Docker dnsmasq необходимо изменить, чтобы привязать к общедоступному IP-адресу вашего сервера, который в данном случае равен 192.168.1.12 на моем интерфейсе eth0

#!/bin/bash

NIC="eth0"

name="dnsmasq_"
timenow=$(date +%s)
name="$name$timenow"

MY_IP=$(ifconfig $NIC | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')


sudo docker run \
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \
--name=$name \
-p=$MY_IP:53:5353/udp \
-d sroegner/dnsmasq

На хосте (в данном случае Ubuntu 12) вам необходимо обновить файл resolv.conf или /etc/network/interfaces, чтобы вы зарегистрировали свой общедоступный IP-адрес (устройство eth0 или eth1) в качестве сервера имен.

введите описание изображения здесь

Возможно, вы захотите установить вторичный сервер имен для google, если контейнер не работает, изменив строку на dns-nameservers xxx.xxx.xxx.xxx 8.8.8.8 Например, нет запятой или другой строки.

Затем вам нужно перезагрузить сетевой сервис sudo /etc/init.d/networking restart если вы обновили файл /etc/network/interfaces, чтобы он автоматически обновлял файл /etc/resolve.conf, который докер будет копировать в контейнер во время сборки.

Теперь перезапустите все ваши контейнеры

  • sudo docker stop $CONTAINER_ID
  • sudo docker start $CONTAINER_ID

Это приводит к обновлению их файлов /etc/resolv.conf, поэтому они указывают на новые настройки сервера имен.

Поиск DNS во всех ваших док-контейнерах (которые вы создали после внесения изменений) теперь должен работать с вашим контейнером dnsmasq!

В качестве дополнительного примечания это означает, что докер-контейнеры на других хостах также могут использовать вашу службу dnsmasq на этом хосте, если в настройках сервера имен их хостов задан открытый IP-адрес этого сервера.

Другие вопросы по тегам