Настройка 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-адрес этого сервера.